Python';舍入的奇怪行为是什么

Python';舍入的奇怪行为是什么,python,python-2.7,floating-point,rounding-error,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:Im使用Python2.7.3、MacOSX、64位python int类型可以轻松超过您的平台字大小,但浮点值与硬件有关。不要混合使用长整型值和浮点值 在第一个示

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

>>> (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:Im使用Python2.7.3、MacOSX、64位

python 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')

谢谢你,玛蒂恩。这对我来说是有道理的,但是为什么python必须以这种不方便的方式来做呢?这是关于性能的吗?@vutran:硬件辅助FP已经成为计算领域的标准几十年了;是的,使用浮点支持要快得多。@vutran还有,很少(如果有的话)真实世界的测量值精确到53位以上。这使得硬件浮点运算既高效又准确,足以满足许多科学和工程编程的需要。