比较在几台不同的计算机上进行的浮点运算结果,发现它们一直产生不同的结果。这里是一个简化的示例,可以复现这种行为:
import numpy as np
from numpy.random import randn as rand
M = 1024
N = 2048
np.random.seed(0)
a = rand(M,N).astype(dtype=np.float32)
w = rand(N,M).astype(dtype=np.float32)
b = np.dot(a, w)
for i in range(10):
b = b + np.dot(b, a)[:, :1024]
np.divide(b, 100., out=b)
print b[0,:3]
不同的机器会产生不同的结果,例如:
- [ -2.85753540e-05 -5.94204867e-05 -2.62337649e-04]
- [ -2.85751412e-05 -5.94208468e-05 -2.62336689e-04]
- [ -2.85754559e-05 -5.94202756e-05 -2.62337562e-04]
但我也可以得到相同的结果,例如在两台同款的MacBook上运行。这种情况发生在安装有相同版本的Python和numpy,但不一定链接同样的BLAS库(例如Mac上的accelerate框架,Ubuntu上的OpenBLAS)的机器上。然而,不同的数值库都应该符合相同的IEEE浮点标准并给出完全相同的结果,是吗?
b /= 100.
和b += np.dot(b, a[:, :1024])
更快更简洁。 - Veedrac