在查找一些NumPy的内容时,我看到了一个讨论NumPy.dot()舍入精度的问题:
Numpy:dot(a,b)和(a*b).sum()之间的区别
因为我碰巧有两台搭载Haswell-CPU的不同计算机放在我的桌子上,这应该提供了FMA和其他一切,所以我想我会测试Ophion在第一个答案中给出的示例,我得到了一个令人惊讶的结果:
在更新/安装/修复lapack / blas / atlas / numpy之后,我在两台计算机上都得到了以下结果:
>>> a = np.ones(1000, dtype=np.float128)+1e-14
>>> (a*a).sum()
1000.0000000000199999
>>> np.dot(a,a)
1000.0000000000199948
>>> a = np.ones(1000, dtype=np.float64)+1e-14
>>> (a*a).sum()
1000.0000000000198
>>> np.dot(a,a)
1000.0000000000176
所以标准的乘法+sum()比np.dot()更精确。然而,timeit确认了,在float64和float128上,.dot()版本更快(但不是很快)。
有人可以解释一下吗?
编辑:我意外删除了关于numpy版本的信息:在Python 3.4.0和3.4.1上,1.9.0和1.9.3的结果相同。
sum
更改的地方。 - Mark Dickinson