这是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
答案 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