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 上,浮点数可以表示的最大十进制位数为 15:

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

但你的整数使用 20 位数字。为了匹配指数,必须将 16.0 浮点数截断为 15 位有效数字,这意味着它基本上四舍五入为 0。

如果必须对长整数使用浮点运算,请使用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 回答