为什么计算顺序会影响浮点数求和的精度?

2020-01-22 23:57:20 +08:00
 Qzier
sum = 0
for i in range(1, 501):
    sum += 1 / i
print(sum)

sum = 0
for i in range(500, 0, -1):
    sum += 1 / i
print(sum)

两种结果的精度为何不同?

6.79282342999052
6.7928234299905235
3737 次点击
所在节点    Python
6 条回复
yexiaoxing
2020-01-23 00:34:47 +08:00
sum 本身也是个浮点数
msg7086
2020-01-23 01:08:16 +08:00
浮点计算每次都可能产生误差,计算顺序当然会影响结果了。
nalzok
2020-01-23 01:38:35 +08:00
考虑这个更简单的例子

>>> (1 + 0.0000000000000001) + 0.0000000000000001
1.0
>>> 1 + (0.0000000000000001 + 0.0000000000000001)
1.0000000000000002

至于为什么呢,因为

>>> 1 + 0.0000000000000001
1.0
>>> 1 + 0.0000000000000002
1.0000000000000002

简单来说,0.0000000000000001 加到 1 上之后就因为精度有限的关系被 discard 掉了;但是如果你先把两个 0.0000000000000001 合成一个 0.0000000000000002 再加到 1 上面,那么这个数字就会因为足够大而不会被 discard
Mutoo
2020-01-23 05:46:14 +08:00
误差主要来自无法用二进制精确表达的十进制。不同的累家顺序会导致这样的十进制出现的情况不同。
hobochen
2020-01-23 13:19:27 +08:00
@Mutoo 误差不是浮点数本身精度有上限吗?和进制转换没关系吧?
Mutoo
2020-01-23 13:39:35 +08:00
@hobochen 涉及到十进制小数,关系就大了。经典的 0.1+0.2 != 0.3

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/639944

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX