當我有兩個(小)數字最小值和最大值並嘗試使用以下代碼獲取介於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)
我有問題,我得到更大的值大於1時min, max
是浮動而min2, max2
是雙打。 現在我讓他們都變數double
,但我仍然不確定浮點錯誤是否會產生錯誤的結果。
後來我想通過使用
const int MAX=63;
double array[64];
int index = (int)(result*MAX);
array[index];
用結果來細分號碼範圍,並希望得到準確的指標甚至小的差異。
其中i混合雙打時得到了問題並浮舉個例子:
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
考慮到你沒有給出任何關於'min2'和'max2'相對於'min'和'min'的任何信息,你能給出一個數學的論證,爲什麼'result' *不應該*能夠超過'1', max'? – EOF
max2 <= max並且min2> = min意味着max2-min2 <= max-min。真正的問題是浮點算術,可能會發生奇怪的事情。 – allo
將此添加爲問題的顯式註釋。 – allo