我试图在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
任何人都可以告诉我,我在这里想念的是什么?
提前致谢!
答案 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