我发现了一些我很好奇的非常有趣的行为。最终,为了科学计算的原因,我希望代码完全可以重现。
无论如何,这里有一段带输出的代码片段。正如您所看到的,相同的计算会导致稍微不同的结果。
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
和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
知道这里发生了什么吗?