Programming/Python
[Python] 부동 소수점(Floating Point), 머신 입실론(Machine Epsilon)
부동 소수점
- 컴퓨터는 정수 부분을 표현하기 위해 비트(0과 1)를 이용하여 숫자를 표현한다.
- 컴퓨터는 소수 부분을 정밀하게 표현하는데 한계가 존재한다.
- 이에, 컴퓨터에서는 부동소수점이라는 것을 사용하여 실수를 표현한다.
- 파이썬에서는 IEEE754 "double-precision" 표준방식으로 부동 소수점을 표현한다.
(참조: 파이썬 공식홈페이지 15.1 https://docs.python.org/3/tutorial/floatingpoint.html )
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 실수 값의 오차
댓글