8퍼센트 이호성
숫자 계산이 의도와 다른 이유와 대안
Python 공식문서를 찾아가며 문제 해결 하기
컴공과 첫 과목의 향수
Text
If two multiples are equally close, rounding is done toward the even choice.
Default 의 변경은 Python 3.0 부터 (What's New In Python 3.0)
왜 2.68이 되지 않는걸까?
The behavior of round() for floats can be surprising.
진법 | 표현 | 계산 |
---|---|---|
10진법 | 0.125 | 1/10 + 2/100 + 5/1000 |
2진법 | 0.001 | 0/2 + 0/4 + 1/8 |
Double-precision floating-point format
부호
지수
가수
진법 | 부호 | 지수 | 가수 | 계산 |
---|---|---|---|---|
10진법 | + | -1 | 1.0 | |
2진법 | + | -4 | 1.6 |
물론 1.6에 가까운 근사값 입니다.
Python 3.1 부터 가장 짧은 표현을 사용
(내가 의도한) 0.1이 (실제로 저장되는) 0.1이 아니라면서
왜 0.1을 보여주는 거죠?
같은수 인가?
출력해 보자
이미 값의 저장시에 오차가 발생 했기 때문에
정확한 비교를 할 수 없다.
언어의 문제가 아닙니다.
테스트시에는 unittest.TestCase.assertAlmostEqual 을 사용
round의 사용
isclose 사용
컴퓨터는 사람들이 학교에서 배우는 것과 동일한 연산 방식을 제공해야 한다.
이름 | 조건 |
---|---|
Inexact | 계산 결과가 정확하지 않을 때 |
Rounded | 유효숫자의 수가 줄어 들었을 때 |
FloatOperation | Decimal과 float가 함께 사용되었을 때 |
계산 과정에서 조건에 따라 Signal이 발생하고, 그 결과 관련된 flag를
설정하거나 trap(Exception)을 발생 시킵니다.
그 외에도 여러가지 Signal 이 있습니다.
의도되지 않은 연산이 일어났을 때 Exception 을 발생 시킨다.
Text
정확한 계산이 필요한 경우 decimal을 사용하자!
208B
4시