vut*_*ran 3 python floating-point rounding-error python-2.7
问题很简单,为什么:
>>> (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
Run Code Online (Sandbox Code Playgroud)
我知道它必须是浮动舍入错误,但我需要一个正式的解释,我们如何避免这种错误?
P/s:我使用的是python 2.7.3,MacOSX,64位
Python int类型可以轻松超出平台字大小,但浮点值与硬件相关联.不要混合long int和浮点值.
在第一个样本中,第一个整数的大小远远超过浮点数的最大精度.
在64位Mac上,浮点数可以表示的最大小数位数为15:
>>> import sys
>>> sys.float_info.dig
15
Run Code Online (Sandbox Code Playgroud)
但你的整数使用20位数.为了匹配指数,16.0 float必须被截断为15位有效数字,这意味着它基本上舍入为0.
如果必须使用长整数的浮点运算,请使用该decimal.Decimal()
类型,它不受硬件限制:
>>> import decimal
>>> (2**32-1)**2 - decimal.Decimal('4.0') ** 2 - (2**32-1)**2
Decimal('-16.00')
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
160 次 |
最近记录: |