Python:math
Example
두 실수가 같은지 판단하기
0.1 + 0.2
는 0.30000000000000004
이므로 0.3
과는 다릅니다. 이렇게 실수를 근삿값으로 표현하면서 발생하는 문제를 부동소수점 반올림 오차(rounding error)라고 합니다. 따라서 실수를 비교할 때는 연산한 값과 비교할 값의 차이를 구한 뒤 sys.float_info.epsilon
보다 작거나 같은지 판단해야 합니다.
x
의 값 0.30000000000000004
에서 0.3
을 뺀 값이 sys.float_info.epsilon
보다 작거나 같으므로 두 값은 같은 값이라 할 수 있습니다. 특히 math.fabs를 사용하여 두 값의 차이를 절댓값으로 만들면 음수가 나오더라도 정상적으로 판단할 수 있습니다.
여기서 sys.float_info.epsilon
에 저장된 값을 머신 엡실론(machine epsilon)이라고 부르는데, 어떤 실수를 가장 가까운 부동소수점 실수로 반올림했을 때 상대 오차는 항상 머신 엡실론 이하입니다. 즉, 머신 엡실론은 반올림 오차의 상한값이며 연산한 값과 비교할 값의 차이가 머신 엡실론보다 작거나 같다면 두 실수는 같은 값이라 할 수 있습니다.
isclose
파이썬 3.5이상부터는 두 실수가 같은지 판단할 때 math.isclose 함수를 사용하면 됩니다.
fabs
Floating 절대값
Decimal으로 정확한 자릿수 표현하기
반올림 오차가 없는 고정소수점을 사용하려면 decimal 모듈의 Decimal을 사용하면 됩니다. Decimal은 숫자를 10진수로 처리하여 정확한 소수점 자릿수를 표현합니다.
자세한 내용은 Python:decimal#Decimal 항목 참조.
Fraction으로 분수 표현하기
순환소수는 고정소수점이라도 정확히 표현할 수 없습니다. 이때는 fractions 모듈의 Fraction을 사용하여 분수로 표현하면 됩니다.
>>> from fractions import Fraction
>>> Fraction('10/3') # 10을 3으로 나누면 순환소수 3.33333...이지만 분수 3분의 10으로 표현
Fraction(10, 3)
자세한 내용은 Python:fractions#Fraction 항목 참조.