3

C で 2 つの double 型の変数を比較するために、 を定義し#define EQUALITY_EPSILON = 1e-8ました。私は次のように比較を行っています:

if((img_score[i] - img_score[j]) >= EQUALITY_EPSILON){
    // handle for ith score greater than jth score
}
else if((img_score[j] - img_score[i]) >= EQUALITY_EPSILON){
    // handle for ith score smaller than jth score
}
else{
    // handle for ith score equal to jth score
}

私が直面している問題は、コード内のスコアが非常に小さいためEQUALITY_EPSILON = 1e-8、 の場合、比較の結果が等しい場合があることです。私の質問は、どのくらい小さく設定できEQUALITY_EPSILONますか?

4

3 に答える 3

14

浮動小数点数は、数直線上で均等に分散されません。それらは 0 付近で非常に密集しており、マグニチュードが増加するにつれて、2 つの表現可能な値の間の「デルタ」が増加します。

                               0
|      |     |    |   |  |  | ||| |  |  |   |    |     |      |

つまり、数値が小さい場合は、小さい「イプシロン」を使用する必要があります。

(編集:許容するエラーまたはイプシロンは、比較する値で既に予想されるエラーと同じ範囲内にある必要があります。つまり、それらを生成した浮動小数点演算によるエラーです。理由については、以下のコメントを参照してください。/編集)。

使用する必要がある「イプシロン」の種類の公正な指標の 1 つは、以下から入手できnextafterますmath.h

nextafter(x, y)xは、数直線に沿って の方向に進むとき、 の次に表現可能な値を返しますy

それを行う別の方法は、 と の間の大きさの差を計算し、img_score[i]またはのimg_score[j]大きさと比較してどれだけ小さいかを確認することです。どれくらい小さい?あなたが決める必要があります。img_score[i]img_score[j]

于 2012-08-20T13:07:15.840 に答える
2

イプシロンに絶対値を使用しないでください。選択する値は、比較する値に対して相対的でなければなりません。

たとえば、最小 (ゼロに最も近い) を 100 万で割り、その絶対値を使用できます。

それが適切な選択であるかどうかは、値に到達するために実行された操作によって異なります。すべての場合に適しているとは限りません。

于 2012-08-20T12:44:57.750 に答える
1

double の最小絶対値は 2^{-1023} で、約 10^{-308} です。ただし、仮数 (有効数字がある部分) を格納するためのビットは 53 ビットしかありません。差のおおよその値が事前にわかっている場合は、イプシロンの差をほぼ 2^{-53} 倍にすることができます。事前にわからない場合は、イプシロンを違いの 1 つのパーセンテージとして構築する必要があります。

差の 2^{-53} 倍まで下がるのは、double の制限された精度によって引き起こされる制限であることに注意してください。減算している 2 つの値が互いに非常に近く、その差が 53 有効ビット未満である場合、イプシロンは差の 2^{-x} 倍 (x は有効ビットの数) まで低くなる可能性があります。違いのビット。

于 2012-08-20T13:08:35.043 に答える