5

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

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

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只是P1d 和 2d 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)

带输出:

i = 9999
0.0

知道这里发生了什么吗?

4

0 回答 0