실제로는 파이썬의 구현에만 국한된 것이 아니라 float to decimal 문자열 함수에 적용해야합니다.
부동 소수점 숫자는 기본적으로 이진수이지만 과학적 표기법에서는 유효 숫자의 제한이 고정되어 있습니다.
밑수와 공유되지 않는 소수 요소를 가진 숫자의 역수는 항상 반복되는 점 점 표현으로 나타납니다. 예를 들어 1/7에는 10과 공유되지 않는 소수 인 7이 있으며 반복되는 10 진수 표현이 있으며, 1/10에 대해 소수 인 2와 5의 경우도 마찬가지이며 후자는 2와 공유되지 않습니다. ; 즉, 0.1은 도트 포인트 뒤에 유한 한 비트 수로 정확하게 표현 될 수 없습니다.
0.1에는 정확한 표현이 없으므로 근사값을 소수점 문자열로 변환하는 함수는 일반적으로 특정 값을 근사하여 0.1000000000004121과 같은 직관적이지 않은 결과를 얻지 않습니다.
부동 소수점은 과학적 표기법이므로 밑의 거듭 제곱에 의한 곱셈은 숫자의 지수 부분에만 영향을 미칩니다. 예를 들어, 십진 표기법의 경우 1.231e + 2 * 100 = 1.231e + 4이고, 이진 표기법의 경우 1.00101010e11 * 100 = 1.00101010e101입니다. 밑이 아닌 거듭 제곱을 곱하면 유효 숫자도 영향을받습니다. 예를 들어 1.2e1 * 3 = 3.6e1
사용 된 알고리즘에 따라 유효 숫자 만 기반으로 공통 소수를 추측하려고 할 수 있습니다. 0.1과 0.4는 모두 부동 소수가 본질적으로 각각 (8/5) (2 ^ -4)와 (8/5) (2 ^ -6)의 잘림 때문에 이진법에서 유효 숫자가 같습니다 . 알고리즘이 8/5 sigfig 패턴을 소수점 1.6으로 식별하면 0.1, 0.2, 0.4, 0.8 등에서 작동합니다. float 3을 float 10으로 나눈 것과 같은 다른 조합에 대한 매직 sigfig 패턴을 가질 수도 있습니다. 통계적으로 10으로 나눈 다른 매직 패턴.
3 * 0.1의 경우, 마지막 몇 개의 중요한 수치는 float 3을 float 10으로 나누는 것과 다를 수 있으므로 알고리즘은 정밀도 손실에 대한 허용 오차에 따라 0.3 상수의 매직 넘버를 인식하지 못합니다.
편집 :
https://docs.python.org/3.1/tutorial/floatingpoint.html
흥미롭게도, 가장 가까운 대략적인 이진 분수를 공유하는 많은 다른 10 진수가 있습니다. 예를 들어, 0.1 및 0.10000000000000001 및 0.1000000000000000055511151231257827021181583404541015625는 모두 3602879701896397/2 ** 55로 근사됩니다.이 10 진수 값은 모두 동일한 근사값을 공유하므로 불변 eval (repr (x) ) == x.
float x (0.3)가 float y (0.1 * 3)와 정확히 같지 않으면 repr (x)가 repr (y)와 정확히 같지 않으면 정밀 손실에 대한 허용 오차가 없습니다.