Python浮点数的总和

The*_*ist 3 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
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我在这里想念的是什么?

提前致谢!

Nic*_*tin 6

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

>>> a = [-1e30, 1e30, 1, 3]
>>> math.fsum(a)
4.0
>>> a = [-1e30, 1, 3, 1e30]
>>> math.fsum(a)
4.0
Run Code Online (Sandbox Code Playgroud)

sum由于固有的精度问题,使用内置函数不会为非常大(或小)的浮点数得到很好的答案.你可以很好地了解每个计算机科学家应该知道的关于浮点算术的血腥细节.


Tim*_*ker 5

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

10**30方式比大2**53,所以将4这个数字在精度浮点数的限制都将丢失。

>>> 2**53
9007199254740992
>>> 10**30
1000000000000000000000000000000
>>> float(2**53)
9007199254740992.0
>>> float(2**53) + 1
9007199254740992.0
Run Code Online (Sandbox Code Playgroud)