Joh*_*chs 12 python precision numpy
在搜索一些numpy的东西时,我遇到了一个讨论numpy.dot()的舍入精度的问题:
因为我碰巧有两台(不同的)计算机和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
Run Code Online (Sandbox Code Playgroud)
所以标准乘法+ sum()比np.dot()更精确.但是timeit确认.dot()版本对于float64和float128来说都更快(但并不多).
任何人都可以为此提供解释吗?
编辑:我不小心删除了numpy版本的信息:1.9.0和1.9.3与python 3.4.0和3.4.1相同的结果.
看起来他们最近添加了一个特殊的成对求和来ndarray.sum提高数值稳定性。
从PR 3685开始,这会影响:
all add.reduce calls that go over float_add with IS_BINARY_REDUCE true
so this also improves mean/std/var and anything else that uses sum.
Run Code Online (Sandbox Code Playgroud)
请参阅此处了解代码更改。