Python浮点数的总和

时间:2014-02-13 09:23:24

标签: python floating-point

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

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

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

任何人都可以告诉我,我在这里想念的是什么?

提前致谢!

2 个答案:

答案 0 :(得分:6)

当你在做浮点数序列的总和时,你想使用math.fsum

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

由于固有的精度问题,使用sum内置函数不会为非常大(或小)的浮点数得到很好的答案。您可以在What Every Computer Scientist Should Know About Floating-Point Arithmetic了解血腥细节。

答案 1 :(得分:4)

浮点数具有53位系数(“e之前的数字”)。

10**30方式大于2**53,因此在浮点数的精度限制中,该数字的加4会丢失。

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