いくつかのnumpyのものを探している間、私はnumpy.dotの丸め精度()議論質問に出くわした:私は2つの(異なる)コンピュータを持って起こるのでnumpyの浮動小数点丸め誤差
Numpy: Difference between dot(a,b) and (a*b).sum()
をハーフウェルCPUが私の机の上に座ってFMAとすべてを提供すべきだと私は最初の答えでオフィオンによって与えられた例をテストすると思っていたが、私は幾分驚いた結果を得た:
更新/ 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()よりも正確です。しかし、.dot()の方がfloat64とfloat128の方が速い(ただしそれほど多くない)ことが確認されています。
誰でも説明ができますか?
編集:誤ってnumpyバージョンの情報を削除しました:python 3.4.0と3.4.1で1.9.0と1.9.3と同じ結果が出ました。
興味深いことに、この不一致は、NumPy 1.8.2ではなく、NumPy 1.9.2でのみ発生します。 両方ともblas + lapack(アトラスではない)を使用します。 NumPy 1.8.2では、結果はNumPy 1.9.2で同じ丸めイベントを示唆するドットとサムと同じですが、乗算+サム()はより正確です。 –
http://docs.scipy.org/doc/numpy/release.html#better-numerical-stability-for-sum-in-some-cases –
も参照してください。https://github.com/numpy/numpy/pull/3685、これは 'sum'の変更が実装された場所です。 –