2017-07-26 10 views
0

最小と最小の2つの小数を持ち、次のコードを使って0と1の間の値を取得しようとすると、0以上の値を取得できますか? 1より?小さな範囲を別の小さな範囲で割ったときの浮動小数点エラー

double min, max, min2, max2, mid, result; 
// min2 < max2 is a subrange of min < max with min2 >= min and max2 <= max 
// where max-min may be very small, which means max2-min2 will be very small as well. 
mid = (min2+max2)/2.0; 
result = (mid - min)/(max-min) 

私はmin2, max2はダブルスであったmin, maxがフロートしたとき、私は1よりも値が大きくなっていること、問題がありました。 ここではすべて変数doubleを作成しましたが、浮動小数点エラーが間違った結果を生むかどうかはまだわかりません。

後、私は

const int MAX=63; 
double array[64]; 
int index = (int)(result*MAX); 
array[index]; 

そして、少しでも違いを正確にインデックスを取得したいを使用して番号範囲を細分化するために、結果を使用します。

ダブルスを混合し、浮いたときに、私は問題を持って例:minとmaxが十分に近い場合

NUM_BINS = 64 
min = -5.00958252 
max = -5.00958014 
min2 = -5.0095801960014716 
max2 = -5.0095799398356107 
mid = (max2+min2)/2.0 
mid - min = 2.4516127083984429e-06 
(mid - min)/(max - min)) * (NUM_BINS - 1) = 64.781696632504463 
+1

あなたは 'min'と' max2'に関する情報を 'min'と' 'min'に対して与えなかったので、' result' *が '1'を越えることができないような数学的な議論を与えることができますか?マックス '? – EOF

+0

max2 <= maxおよびmin2> = minは、max2-min2 <= max-minを意味します。本当の疑問は、奇妙なことが起こりうる浮動小数点演算についてです。 – allo

+0

これを明示的なコメントとして質問に追加しました。 – allo

答えて

2

は、IEEE754演算を仮定すると、次いで、差は正確であるが。

必ずしも厳密されていない中間点を算出するための平均(2で除算正確なアンダーフローを想定していないが、合計ではありません)が、以下の式が全て真である:

min2 <= mid 
mid <= max2 

mid-minが正確であろう(したがって、<= (max-min))、最後の不正確な演算/は、最も近い浮動小数点値に丸めます。正確な値は< = 1なので、1より大きい値を四捨五入する理由はありません。

上記の関係は、コンパイラが超過精度を使用することを決定した場合でも保持されます。混在した精度を使用したときに何が起こるかもしれませんが、私はよく分かりません...(16進形式で)正確な値を表示できるかどうか不思議です。

+0

質問に値を追加しました(16進数ではなく、デバッグ時に保存したのと同じです)。 – allo

+0

OKですが、あなたの例ではmax

+0

はい、その例は明らかに間違っていました。これは浮動小数点数と倍精度浮動小数点数が混在しているため、ここで問題が発生しかし、私は同じ浮動小数点型を使用して実際に問題を解決したのか、特定の(小さい)値で再び発生する可能性があるのか​​どうかはわかりません。 – allo

関連する問題