5

Python 2.7.2 (MSC v.1500 32 ビット (Intel)] on win32) と numpy 1.6.1 を搭載した 2 台のコンピューターがあります。しかし

numpy.mean(data)

戻り値

1.13595094681 on my old computer 

1.13595104218 on my new computer

どこ

Data = [ 0.20227873 -0.02738848  0.59413314  0.88547146  1.26513398  1.21090782
1.62445402  1.80423951  1.58545554  1.26801944  1.22551131  1.16882968
1.19972098  1.41940248  1.75620842  1.28139281  0.91190684  0.83705413
1.19861531  1.30767155]

両方の場合において

s=0
for n in data[:20]:
  s+=n
print s/20

与える

1.1359509334

誰も理由と回避方法を説明できますか?

マッツ

4

2 に答える 2

3

2 つの違いを避けたい場合は、明示的に 32 ビットまたは 64 ビットの float 配列にします。NumPy は、32 ビットまたは 64 ビットの他のライブラリをいくつか使用します。print ステートメントでも丸めが発生する可能性があることに注意してください。

>>> import numpy as np
>>> a = [0.20227873, -0.02738848,  0.59413314,  0.88547146,  1.26513398,
         1.21090782, 1.62445402,  1.80423951,  1.58545554,  1.26801944,
         1.22551131,  1.16882968, 1.19972098,  1.41940248,  1.75620842,
         1.28139281,  0.91190684,  0.83705413, 1.19861531,  1.30767155]
>>> x32 = np.array(a, np.float32)
>>> x64 = np.array(a, np.float64)
>>> x32.mean()
1.135951042175293
>>> x64.mean()
1.1359509335
>>> print x32.mean()
1.13595104218
>>> print x64.mean()
1.1359509335

もう 1 つの注意点は、マルチスレッド化された低レベルのライブラリ (たとえば、atlas、lapack) がある場合、大規模な配列の場合、演算の可変順序と浮動小数点の精度が原因で、結果に違いが生じる可能性があることです。 .

また、32 ビット数値の精度の限界に達しています。

>>> x32.sum()
22.719021
>>> np.array(sorted(x32)).sum()
22.719019
于 2012-11-16T21:19:19.520 に答える
0

これは、Float32配列 (単精度) があるために発生しています。単精度では、演算は小数点以下 6 桁までしか正確ではありません。したがって、結果は小数第 6 位までは同じですが (小数点以下、最後の桁を四捨五入)、それ以降は正確ではありません。その後、アーキテクチャ/マシン/コンパイラが異なると、異なる結果が得られます。同じ結果が必要な場合は、より精度の高い配列を使用する必要があります (例: Float64)。

于 2012-11-17T04:40:34.503 に答える