이 포스트는 개인적으로 공부한 내용을 정리한 글입니다.
자세한 내용은 아래 참고자료를 봐주시면 감사하겠습니다.
>>> 4.3 + 2.7
7.0
>>> 4.3 - 2.7
1.5999999999999996
>>> 1.5 * 3.1
4.65
>>> 5.5 / 3.1
1.7741935483870968
실수의 뺄셈인 4.3 - 2.7 의 계산결과가 우리의 생각과는 괴리가 있습니다.
>>> 0.1 + 0.2
0.30000000000000004
0.1 + 0.2 의 계산 결과도 우리의 생각과 다른데, 이는 파이썬이 실수를 부동소수점 방식으로 표현하기 때문입니다.
부동소수점은 실수를 정확히 표현할 수 없는 문제가 있습니다.
따라서 실수를 아래와 같이 비교를 한다면 같지 않다고 나옵니다.
>>> 0.1 + 0.2 == 0.3
False
그럼 어떻게 비교해야할까?
>>> import math, sys
>>> x = 0.1 + 0.2
>>> x
0.30000000000000004
>>> math.fabs(x - 0.3)
5.551115123125783e-17
>>> math.fabs(x - 0.3) <= sys.float_info.epsilon
True
여기서 sys.float_info.epsilon에 저장된 값을 머신 엡실론(machine epsilon)이라고 부르는데, 어떤 실수를 가장 가까운 부동소수점 실수로 반올림했을 때 상대 오차는 항상 머신 엡실론 이하입니다. 즉, 머신 엡실론은 반올림 오차의 상한값이며 연산한 값과 비교할 값의 차이가 머신 엡실론보다 작거나 같다면 두 실수는 같은 값이라 할 수 있습니다.
참고자료 (파이썬 코딩 도장)
라고 합니다.
>>> import math
>>> math.isclose(0.1 + 0.2, 0.3)
True
위의 방법을 사용하면 더 간단하게 비교가 가능합니다.