Python 大浮点数之和

Python 大浮点数之和,python,floating-point,Python,Floating Point,我试图在Python3中添加一些浮点值(在2中从未测试过),我得到了一些奇怪的结果,唯一的变化因素是求和中元素的顺序 a = [-1e30, 1e30, 1, 3] print(sum(a)) # return 4.0 a = [-1e30, 1, 3, 1e30] print(sum(a)) # return 0.0 谁能告诉我我错过了什么 提前谢谢 浮点数有一个53位的系数(“e前面的数字”) 10**30比2**53大得多,因此在该数字上加上4在浮点数的精度限制中丢失 >

我试图在Python3中添加一些浮点值(在2中从未测试过),我得到了一些奇怪的结果,唯一的变化因素是求和中元素的顺序

a = [-1e30, 1e30, 1, 3]
print(sum(a))   # return 4.0

a = [-1e30, 1, 3, 1e30]
print(sum(a))   # return 0.0
谁能告诉我我错过了什么


提前谢谢

浮点数有一个53位的系数(“e前面的数字”)

10**30
2**53
大得多,因此在该数字上加上4在浮点数的精度限制中丢失

>>> 2**53
9007199254740992
>>> 10**30
1000000000000000000000000000000
>>> float(2**53)
9007199254740992.0
>>> float(2**53) + 1
9007199254740992.0

当您对浮点数序列求和时,您希望使用
math.fsum

>>> a = [-1e30, 1e30, 1, 3]
>>> math.fsum(a)
4.0
>>> a = [-1e30, 1, 3, 1e30]
>>> math.fsum(a)
4.0

由于固有的精度问题,对于非常大(或很小)的浮点数,使用
sum
内置函数无法得到很好的答案。你可以在上看到血淋淋的细节。

谢谢你的参考书。我来看看。有趣的是,如果我把大数字一个接一个地放在一起,我会得到一个4,这是我无法解释的。@Best悲观主义者:如果你把它们一个接一个地放在一起,它们会首先相互作用,实际上等于零。然而,对这些数字中的任何一个加上任何东西都不会增加它们的值,所以分离它们只是意味着中间的数字会丢失。是的,我得出了相同的结论。我在想,如果我加上一个足够大的数字,它实际上会有所不同。“我说得对吗?”最佳悲观主义者:是的,尽管在这些值下,这个数字必须非常大。:-)这个
float(2**53)<(float(2**53)+1)=False
帮助我理解了它是如何运行的,但有些事情仍然不清楚。“系数”被恰当地称为“有效位”,也被不恰当但非常常见地称为“尾数”。1030大于253这一事实与向其中添加4是不精确的这一事实没有直接关系。0.2和0.1很小,但添加它们并不精确。260和260是大的,但加起来是精确的。