【发布时间】:2016-11-12 07:41:47
【问题描述】:
玩了一下数值稳定性,发现了这个:
>>> sum([1e4,1e20,-1e20])
16384.0
任何想法为什么会发生这种情况?
【问题讨论】:
标签: python-2.7 python-3.x
玩了一下数值稳定性,发现了这个:
>>> sum([1e4,1e20,-1e20])
16384.0
任何想法为什么会发生这种情况?
【问题讨论】:
标签: python-2.7 python-3.x
前两个数字无法准确求和,因为 Python 的浮点表示不支持那么多有效的十进制数字(它支持 16 位,而您的总和需要 17 才能准确表示)。 Python 正在用尾数的最低有效部分中的一位来近似答案。
添加第三个数字后得到的答案与您期望的答案之间的差异表示中间结果表示中的错误。在那次减法之后,尾数中的那一位就是剩下的了。当指数归一化时,剩下的就是 16384。事实上,它是两个的幂,可以让您了解正在发生的事情。
【讨论】: