3

質問は簡単です、なぜこれが:

>>> (2**32-1)**2 - 4.0**2 - (2**32-1)**2
0.0
>>> (2**32-1)**2 - (2**32-1)**2 - 4.0**2
-16.0

浮動小数点の丸め誤差に関するものでなければならないことはわかっていますが、正式な説明が必要であり、このようなエラーを回避するにはどうすればよいですか?

P/s: Python 2.7.3、MacOSX、64ビットを使用しています

4

1 に答える 1

6

Python の int 型は、プラットフォームのワード サイズを簡単に超えることができますが、浮動小数点値はハードウェアに結び付けられています。long int 値と浮動小数点値を混在させないでください。

最初のサンプルでは、​​最初の整数のサイズが浮動小数点数の最大精度をはるかに超えています。

64 ビット Mac では、float が表すことができる 10 進数の最大桁数は 15 です。

>>> import sys
>>> sys.float_info.dig
15

ただし、整数は20桁を使用します。指数を一致させるには、16.0 float を有効数字 15 桁に切り詰める必要があります。つまり、基本的に 0 に丸められます。

long 整数で浮動小数点演算を使用する必要ある場合は、decimal.Decimal()型を使用してください。ハードウェアによる制限はありません。

>>> import decimal
>>> (2**32-1)**2 - decimal.Decimal('4.0') ** 2 - (2**32-1)**2
Decimal('-16.00')
于 2013-09-24T06:47:23.030 に答える