python数值错误:大数字加小号

时间:2016-03-17 02:13:14

标签: python precision numerical-analysis numerical-computing

这是Udacity深度学习课程的练习。

任何人都可以解释为什么最终答案不是1.0?

v1 = 1e9
v2 = 1e-6
for i in range(int(1e6)):
    v1 = v1 + v2
print 'answer is', v1 - 1e9
# answer is 0.953674316406

2 个答案:

答案 0 :(得分:0)

因为1e-6不能完全表示为浮点值:

print("{:.75f}".format(1e-6))
'0.000000999999999999999954748111825886258685613938723690807819366455078125000'

如果您使用可以完全表示的数字,例如v2 = 1.0/(2**20),并将迭代次数更改为2**20,您将获得0。但是,正如@ user2357112指出的那样,即使只有使用浮点值可以准确表示所有中间结果,该属性才会成立。

查看Python教程以获取更多详细信息:https://docs.python.org/3/tutorial/floatingpoint.html

答案 1 :(得分:0)

让我们检查v1在浮点数中v2看到的内容:

>>> v3 = (v1+v2)-v1
>>> print "%.25f %.25f" % (v3,1e6*v3)
0.0000009536743164062500000 0.9536743164062500000000000

除了领先的1之外,其他所有内容都会移出1e-6的二进制尾数,同时将指数与1e9进行均衡。这意味着最终值为10**6 * 2**(-20) = (1.024)**(-2),它精确地给出了观察值

>>> print "%.17f" % (1.024)**(-2)
0.95367431640625000