我发现了一些我很好奇的非常有趣的行为。最终,出于科学计算的原因,我想要完全可重现的代码。
无论如何,这是一段带输出的代码。如您所见,相同的计算会导致略有不同的结果。
np.random.seed(0)
x = np.random.randn(100)
P = np.random.randn(100, 100)
for i in range(10):
a1 = P.dot(x)
a2 = P.dot(x)
b1 = x.dot(a1)
b2 = x.dot(a2)
if b1 != b2:
break
print 'i = {}'.format(i)
print np.abs(a1 - a2).max()
print np.abs(b1 - b2)
print b2
这是输出:
i = 1
0.0
1.7763568394e-15
-10.2398857939
我的两个变量,x
只是P
1d 和 2d numpy 数组。然而不知何故,相同的简单计算给出了不同的结果。此外,在循环的不同迭代中,未能给出相同结果的试验会有所不同。例如,在这种情况下,i = 0
试验没有问题,但计算未能给出相同的结果i = 1
。
有趣的是,如果我不将中间值保存在a1
and中a2
,那么结果是相同的:
for i in range(10000):
b1 = x.dot(P.dot(x))
b2 = x.dot(P.dot(x))
if b1 != b2:
break
print 'i = {}'.format(i)
print np.abs(b1 - b2)
带输出:
i = 9999
0.0
知道这里发生了什么吗?