2017-05-05 5 views
0

私はIDLコードをPythonに翻訳しており、最終製品の違いに気づいています。違いは無視できません(IDL経由では19.03、Pythonでは19.16となります)。私は、2つのスクリプトが同じ値(通常は4番目、5番目、または6番目の小数点で異なる)を得ることを、複数の配列操作を開始する時点まで確認しました。私は精度が原因である可能性があると思っています(PythonとIDLの両方の配列はtype=FLOATです)。私は簡単な実験をしましたが、ここでも大きな違いがあります。確かにIDL対Python Float

IDL

a = 0.01 
b = 0.0 

for r = 1,1000 do begin 
    b += a 
endfor 
c = a * 1000 

print,b 
    >>> 10.0001 
print,c 
    >>> 10.0000 

Pythonの

​​

、違いは、この例ではまだ小さいですが、Pythonは明確にIDLがより真実にはるかに近いです。両方の言語がFLOAT精度を使用しているので、結果は同じであると予想しました。一番下の行は、エラーが両方の言語で異なる方法で伝播していることで、異なる結果が得られます。私の質問は以下のとおりです。

  1. 2つの言語間の精度の差がある(これは、Pythonの場合と同様、すなわちFLOATは、IDLで同じことを意味し、私はそれがないと思いますか)?

  2. 精度差を調整する方法はありますか?

  3. 私はIDLに関する多くの経験がありません。明白な何かが欠けている?

PS:

私がポップアップthis記事を書いていたとして。 OP(Pythonは正しい)と同じ問題が発生しています。 IDLで

IDL

>>> 3015/0.0002529821940697729 
>>> 11917835. 

パイソン

>>> 3015/0.0002529821940697729 
>>> 11917834.814763514 
+0

'FLOAT'は精度ではありません...また、ここで' numpy'を使用していません... –

+0

十分なjuanpaです。私は最近ナンパーを心に持っていると思う。質問が修正されました。 – tnknepp

答えて

6

FLOAT単精度(32ビット)であり、そしてDOUBLE倍精度(64ビット)です。

Python(およびnumpy)では、デフォルトの浮動小数点型は倍精度(64ビット)です。

次のようにnumpyのを使用して、単精度IDL計算を再作成することができます。

In [9]: import numpy as np 

In [10]: a = np.array(0.01, dtype=np.float32) 

In [11]: b = np.array(0.0, dtype=np.float32) 

In [12]: for r in range(1000): 
    ...:  b += a 
    ...:  

In [13]: c = a*1000 

In [14]: print(b) 
10.000133514404297 

In [15]: print(c) 
9.99999977648 

あなたがabのより多くの桁数を印刷するにはIDLのprint文のFORMAT引数を使用し、値にそれらを比較することができます上に示しました。

+0

これは非常に役に立ちます。私はいつも "FLOAT"は言語間で同じことを意味していると仮定しました。それは事実ではないことを知ることは良いことです。 – tnknepp

+0

@tnkneepだけでなく、同じ言語では一貫性がないだけでなく、プリミティブは*プラットフォーム*全体で一貫していません。ハードウェアによっては、Doubleは64ビットでなくても計算精度が高いかもしれません(たとえば、内部プロセッサの中には、内部で64ビットに格納されていても浮動小数点計算を実行する80ビット浮動小数点ユニットがあります) – snb