最小と最小の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
あなたは 'min'と' max2'に関する情報を 'min'と' 'min'に対して与えなかったので、' result' *が '1'を越えることができないような数学的な議論を与えることができますか?マックス '? – EOF
max2 <= maxおよびmin2> = minは、max2-min2 <= max-minを意味します。本当の疑問は、奇妙なことが起こりうる浮動小数点演算についてです。 – allo
これを明示的なコメントとして質問に追加しました。 – allo