Python:浮動小数点演算の問題と制限

1221 ワード

再計算機のハードウェアでは,浮動小数点数はバイナリ小数で表される.例えば小数
0.125

1/10+2/100+5/1000と見なすことができ、同様の方式でバイナリ小数
0.001
は、0/2+0/4+1/8とみなすことができる.
この2つの小数の実際の値は同じで、唯一の違いは0.125が10進数で、0.001がバイナリである.しかし不幸なことに、多くの10進数小数は2進数小数で正確に表すことができない.通常、入力した10進数浮動小数点数は、マシンに格納されている2進数浮動小数点数によってのみ近似できます.何桁のバイナリ数字を使っても、10進数の0.1は正確にバイナリ小数で表すことができません.それは無限に繰り返される小数です.
0.0001100110011001100110011001100110011001100110011...

pythonを実行する典型的なコンピュータでは、浮動小数点数は53ビットの精度を有するため、10進数の0.1は内部に以下のように格納される.
0.00011001100110011001100110011001100110011001100110011010

実際には,格納されたデータが元の10進数の近似表現であることを忘れがちである.Pythonは,再計算機に格納された真の10進数の近似数のみをバイナリ形式で示す.のように
0.1000000000000000055511151231257827021181583404541015625

ほとんどの桁数は使用されませんのでpythonは四捨五入された値しか表示されません
0.1

実際には、次のような例がたくさんあります.
>>> 0.1 + 0.2
0.30000000000000004
>>> round(2.675, 2)
2.67

decimalモジュールを使用すると、正確な浮動小数点数の値が表示されます.
>>> from decimal import Decimal
>>> Decimal(2.675)
Decimal('2.67499999999999982236431605997495353221893310546875')