Python

[Python] 엡실론(Epsilon)과 부동소수점 개념 알아보기

여백 :: 2024. 12. 28. 17:09

 

엡실론(Epsilon)이란, 컴퓨터에서 부동소수점 숫자 연산의 '정확도 한계'를 나타내는 개념이다.

이 값은 매우 작은 숫자로, 두 부동소수점 숫자가 실제로는 같아야 하지만 컴퓨터에서 계산된 값에 오차가 있을 때 그 오차의 크기를 측정하는 데 사용된다.

 

파이썬에서는 sys.float_info.epsilon 을 통해 이 값을 확인할 수 있으며, 이는 64비트 부동소수점에서 가장 작은 양의 숫자이다.

import sys
print(sys.float_info.epsilon)  # 2.220446049250313e-16

 

예를 들어 10.0 % 3.2 를 하면 0.4가 아니라 0.39999999999999947 이 나오는데, 그 이유는 다음과 같다.

 

1. 부동 소수점 표현의 한계

- 컴퓨터는 소수를 이진수로 변환하여 저장한다.

하지만 3.2와 같은 소수는 이진수로 정확히 표현되지 않는 경우가 많다.

 

10.0 : 이진수로 정확히 표현 가능 (1010.0)

3.2 : 이진수로 정확히 표현 불가능 (11.0011001100110011....)

 

따라서 컴퓨터는 3.2를 근사치로 저장하는데, 이로 인해 연산 과정에서 약간의 오차가 발생한다.

 

 

2. 나머지 연산의 과정

 

10.0 % 3.2의 계산은 다음과 같은 수식을 따른다.

나머지 = 10.0 - (정수 몫 X 3.2)

 

이때,

정수 몫 : 10.0/3.2 = 3

계산 : 10.0 - (3 X 3.2) = 10.0 - 9.6 = 0.4

이렇듯 이론적으로 나머지는 0.4가 되어야 하지만, 컴퓨터가 부동 소수점 표현의 한계로 인하여 3.2를 근사치로 저장했기 때문에 실제 계산 과정에서는 미세한 오차가 누적되어 0.39999999999999947가 나오게 된다.

 

 

Q. 엡실론과의 연관성?

엡실론은 이러한 미세한 오차를 처리하기 위해 사용된다.

두 값이 정확히 같지 않더라도, 그 차이가 엡실론보다 작다면 다음과 같이 "같다"고 간주할 수 있다.

a = 0.4
b = 0.39999999999999947

epsilon = sys.float_info.epsilon
if abs(a - b) < epsilon:
    print("a와 b는 사실상 같습니다.")
else:
    print("a와 b는 다릅니다.")

 

참고로 이러한 현상은 파이썬뿐만 아니라 모든 프로그래밍 언어에서 부동소수점을 사용할 때 공통적으로 나타나게 된다.

 

 

즉 요약하면 다음과 같음

  • 엡실론 : 부동소수점 연산에서 발생하는 미세한 오차를 측정하는 기준 값
  • 10.0 % 3.2의 결과가 이상하게 나오는 이유는 부동소수점 표현의 한계 때문
  • 엡실론은 부동소수점 연산에서 두 숫자가 사실상 같은지를 확인하는 데 유용하다.