Programming/Python

[Python] 부동 소수점(Floating Point), 머신 입실론(Machine Epsilon)

[앙금빵] 2022. 3. 27.

 

부동 소수점

  • 컴퓨터는 정수 부분을 표현하기 위해 비트(0과 1)를 이용하여 숫자를 표현한다.
  • 컴퓨터는 소수 부분을 정밀하게 표현하는데 한계가 존재한다.
  • 이에, 컴퓨터에서는 부동소수점이라는 것을 사용하여 실수를 표현한다.
  • 파이썬에서는 IEEE754 "double-precision" 표준방식으로 부동 소수점을 표현한다.
    (참조: 파이썬 공식홈페이지 15.1 https://docs.python.org/3/tutorial/floatingpoint.html )

참조: https://en.m.wikipedia.org/wiki/Machine_epsilon

 

Machine Epsilon

  • sys.float_info.epsilon에 저장된 값을 Machine Epsilon이라 부른다.
  • Machine Epsilon(sys.float_info.epsilon) 값은 2.220446049250313e-16 이다.
  • 어떤 실수를 가장 가까운 부동소수점 실수로 반올림 하였을 때 상대오차는 항상 Machine Epsilon 이하이다. [1]
  • 연산한 값과 비교할 값의 차이가 Machine Epsilon 보다 작거나 같다면 두 실수는 같은 값이라 정의한다. [2]
    (개인적인 생각으로 수학에서 극한값을 정의하기 위한 입실론-델타(ε-δ) 논법과 유사하다.)

 

[1] 명제 실험

어떤 실수를 가장 가까운 부동소수점 실수로 반올림 하였을 때 상대오차는 항상 Machine Epsilon 이하이다.

Machine_epsilon=sys.float_info.epsilon

# Machine_epsilon 값 확인
print(Machine_epsilon) # 2.220446049250313e-16

# 실수 연산이 Machine_epsilon의 보다 작은지 검증
x=0.1414 + 0.4545
print(abs(x-0.5959) <= Machine_epsilon) # True

# 실수 연산으로 나온 값과 실수 값이 같은지 여부 확인
0.1414 + 0.4545 == 0.5959 # True

 

[2] 명제 실험

연산한 값과 비교할 값의 차이가 Machine Epsilon 보다 작거나 같다면 두 실수는 같은 값이라 정의한다. 

(1) point_value=2.5 +1e-(10~20)


point_value = 2.5 + 0.00000000001 (10^-10)

point_value = 2.5 + 0.000000000001 (10^-11)

··· 

point_value = 2.5 + 0.0000 ··· 00001 (10^-19)

 

(2) point_value - 2.5 (실수) <= Machine epsilon 조건이 되었을 때 결과값이 어떻게 되는지 확인

 

Test Code

for i in range(10,20):
        e_value=10**(-i)
        point_value=2.5+e_value

        # 40자리수 까지 표현
        print('floating point','%0.40f'%float(point_value-2.5), '| 1e-'+str(i))
        print('='*10)

 

 

[1] [2] 명제 시사점

  • 두 실수의 차가 Machine Epsilon(2.220446049250313e-16) 보다 크다면 두 실수는 다른 값이라고 파이썬에서 정의한다.
  • 두 실수의 차가 Machine Epsilon(2.220446049250313e-16) 보다 작다면 두 실수는 같은 값이라고 파이썬에서 정의한다.

 


참조

[System Programming] 02. 부동소수점(Floating Point)의 표현

https://roadtodeveloper.tistory.com/29

[코딩도장] 47.7 실수 값의 오차

https://dojang.io/mod/page/view.php?id=2466

댓글