Python + numpy:相同的代码,不同的数值结果

Sea*_*ice 5 python numpy scientific-computing reproducible-research

我发现了一些我很好奇的非常有趣的行为。最终,出于科学计算的原因,我想要完全可重现的代码。

无论如何,这是带有输出的代码片段。正如您所看到的,相同的计算会导致略有不同的结果。

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
Run Code Online (Sandbox Code Playgroud)

这是输出:

i = 1
0.0
1.7763568394e-15
-10.2398857939
Run Code Online (Sandbox Code Playgroud)

我的两个变量,xP只是一维和二维数组numpy的。然而不知何故,相同的简单计算给出了不同的结果。此外,在循环的不同迭代中,未能给出相同结果的试验会有所不同。例如,在这种情况下,i = 0试验没有问题,但计算未能给出相同的结果i = 1

有趣的是,如果我不在a1and 中保存中间值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)
Run Code Online (Sandbox Code Playgroud)

有输出:

i = 9999
0.0
Run Code Online (Sandbox Code Playgroud)

知道这里发生了什么吗?