実際にはPythonの実装に固有ではありませんが、浮動小数点から10進数の文字列関数に適用する必要があります。
浮動小数点数は基本的に2進数ですが、有効数字の固定制限を持つ科学表記法です。
基数と共有されていない素数の因数を持つ任意の数の逆は、常に繰り返しドットポイント表現になります。たとえば、1/7には素因数7があり、10と共有されないため、繰り返し10進数表現があり、素数因数2と5の1/10にも同じことが当てはまり、後者は2と共有されません。 ; つまり、0.1はドット点の後の有限ビット数で正確に表すことはできません。
0.1には正確な表現がないため、近似を小数点文字列に変換する関数は通常、0.1000000000004121のような直感的でない結果が得られないように特定の値を近似しようとします。
浮動小数点は科学表記であるため、底のべき乗による乗算は、数値の指数部にのみ影響します。たとえば、10進表記の場合は1.231e + 2 * 100 = 1.231e + 4であり、同様に、2進表記の場合は1.00101010e11 * 100 = 1.00101010e101です。ベースの非べき乗を掛けると、有効数字も影響を受けます。たとえば、1.2e1 * 3 = 3.6e1
使用されるアルゴリズムによっては、有効数字のみに基づいて一般的な小数を推測しようとする場合があります。0.1と0.4はどちらも、2進数で同じ有意な数値を持っています。これは、それらの浮動小数点数が本質的にそれぞれ(8/5)(2 ^ -4)と(8/5)(2 ^ -6)の切り捨てであるためです。アルゴリズムが8/5 sigfigパターンを小数1.6として識別した場合、0.1、0.2、0.4、0.8などで機能します。float3をfloat 10で除算するなど、他の組み合わせのマジックsigfigパターンもある場合があります。統計的に10で割ることによって形成される可能性が高い他の魔法のパターン
3 * 0.1の場合、最後の数桁の有効数字は、浮動小数点数3を浮動小数点数10で除算したものとは異なる可能性があり、精度の損失に対する許容度に応じて、アルゴリズムは0.3定数のマジック番号を認識できません。
編集:https :
//docs.python.org/3.1/tutorial/floatingpoint.html
興味深いことに、同じ最も近い2進小数を共有する多くの異なる10進数があります。たとえば、0.1と0.10000000000000001と0.1000000000000000055511151231257827021181583404541015625はすべて3602879701896397/2 ** 55で近似されます。これらの10進値はすべて同じ近似値を共有するため、不変のeval(repr(x)を維持しながら、それらのいずれか1つを表示できます。 )== x。
精度の低下は許容されません。floatx(0.3)がfloat y(0.1 * 3)と完全に等しくない場合、repr(x)はrepr(y)と完全には等しくありません。