pythonの浮動小数点数の計算が不正確です

1056 ワード

a = 1.2
b = 1.0
print(a-b)

結果:0.19999999999999996
そしてこれはPythonのバグの一つだと思います.実はそうではありません.これはPythonとはあまり関係ありませんが、下位プラットフォームが浮動小数点数をどのように処理するかという関係はもっと大きいです.
CPythonのfloatタイプはC言語のdoubleタイプを使用して格納されます.floatオブジェクトの値は、PythonがCオペレーションを使用しているため、プロセッサ内のハードウェア実装に依存して浮動小数点演算を実行する固定精度(通常53ビット)で格納されたバイナリ浮動小数点数である.これは、浮動小数点演算について、CおよびJavaを含む多くのストリーム言語と同様の動作をすることを意味する.
10進数で簡単に表現できる多くの数字は、2進数浮動小数点では表現できません.たとえば、次のようになります.
>>> x = 1.2

xに格納される値は、10進数の値1.2(非常に近い)の近似値ですが、完全に等しくありません.典型的なマシンでは、実際に格納されている値は次のとおりです.
1.001100110011001100110011001100110011001100110011001100110011(binary)正確には、
1.19999999999995559107901499373830547332763671875(decimal)の典型的な53ビット精度は、Python浮動小数点数に15〜16ビットの精度を提供する.