2017-07-17 13 views
1

これは他の(おそらくすべての)言語では間違いありませんが、私はPythonでしかテストしていません。私の質問は次のとおりです: 異なる精度の2つの値に対して算術演算を行うとき、なぜNumPyは最高精度のdtypeで結果を返しますか?例えばNumPyは、浮動小数点演算の精度をより低い精度にキャストします。

import numpy as np 

single = np.array([[1, 2, 3], [4, 5, 6]], np.float32) 
double = np.array([[1, 2, 3], [4, 5, 6]], np.float64) 

diff = single-double 

print "single data type -", single.dtype 
print "double data type -", double.dtype 
print "diff data type -", diff.dtype 

利回り:

単一のデータ・タイプ - のfloat32
doubleデータ型 - のfloat64
差分データ型 - のfloat64

私は浮動理解でポイントの精度、余分な後半の図形diffの記述は正確ではありません。その場合、最低精度ではなく最高精度に結果をキャストする理由は何ですか?

答えて

2

これは、致命的なキャンセルと呼ばれる数値計算の原則です。

2つの浮動小数点のわずかな例を考えてみましょう。 3.0000900 - 3.000、小数点以下4桁までキャストした場合、または4バイトにキャストした場合、結果の値は0です。ただし、これらの値は実際には同じではありません。私が上で示した現象は、破滅的な相殺と呼ばれています。私たちは本質的に、その問題を切り捨てたり、丸めたりした結果、情報を失いつつあります。

これを避けるには、情報の損失が最小限であるため、これらの操作の結果は常により正確な型に型キャストされます。

2

これは型強制と呼ばれ、少なくともNumPyでは精度が犠牲にならず、オーバーフローを起こさないように、常に精度が高い型に変換します。 float64への強制と例えば

( "オーバーフロー" に関する)それは(ソートの)作品:

>>> np.float64(1e40) - np.float32(1) 
1e40 

しかし、それはあなたが得るでしょうfloat32に強制するかどう:

>>> np.float64(1e40).astype(np.float32) - np.float32(1) 
inf 

ています最大のfloat323.4028235e+38です。

>>> np.finfo(np.float32) 
finfo(resolution=1e-06, min=-3.4028235e+38, max=3.4028235e+38, dtype=float32) 
0

答えは、ほとんどmathematics and the types of numbersです。

types64の型は、実数型(浮動小数点数)に整数型の型が含まれるのと同じ方法でtypes32のアンサンブルを含みます。

結果セットをより大きなデータコンテナ(32ではなく整数型64)にマップすると、満足のいく結果が得られることが保証されますが、マッピングすると結果が切り捨てられないことは保証できません潜在的に短いコンテナ内の値のセット。無効な結果が生じることを意味します。

これは常にフロートとintでこのようになっています。float(実数)は整数を数学的に含むことができ、逆は真ではない(整数型は実数を含まない)ため、floatにintを掛けるとほとんどの言語でfloatが得られます。

関連する問題