mit-scheme의 부동 소수점 곱셈이 정확하지 않다는 것을 알았습니다. 예를 들어,
1 ]=> (* 1991.0 0.1)
생산할 것이다
;Value: 199.10000000000002
뒤에 오는 숫자 "2"가 이상하게 나타나는 이유를 설명해 주실 수 있나요?
답변1
기억하세요, 컴퓨터는 바이너리입니다.
사용하고자 하는 2진수 수에 관계없이 소수 값 0.1은 2진수로 정확하게 표현될 수 없습니다.
base2에서 1/10은 0.0001100110011001100110011...(영원히 반복됩니다)
안타깝게도 이는 이진 부동 소수점 결과이며 FPU를 사용하는 모든 언어(예: Python)는 유사한 결과를 갖습니다.
In [1]: 1991.0 * 0.1
Out[1]: 199.10000000000002
In [2]: 0.1 + 0.2
Out[6]: 0.30000000000000004
이는 Representation error
소수 분수가 이진(기수 2) 분수로 정확하게 표현될 수 없는 경우가 많기 때문입니다.
Perl, C, C++, Java, Fortran, Python 및 구성표는 모두 이 동작을 보여줍니다.
답변2
이 인용문은 기억에서 나온 것이므로 아마도 정확하지는 않지만 문제의 본질을 전달합니다. "부동 소수점 숫자에 대한 연산은 모래 더미를 옮기는 것과 같습니다. 수행할 때마다 약간의 모래를 잃게 됩니다. 또한 약간의 모래가 있습니다.(Kernighan 및 Plauger의 "프로그래밍 스타일 요소" IIRC에서) 모든 프로그래밍 언어에는 이 문제가 있습니다.