Python关于舍入的奇怪行为

时间:2013-09-24 06:32:51

标签: python python-2.7 floating-point rounding-error

问题很简单,为什么会这样:

>>> (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位

1 个答案:

答案 0 :(得分: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')