14

このコードスニペットは他の場所から入手しています。ウェブマスターによると、コードはクヌースによるコンピュータープログラミングの芸術から選ばれています

その本を持っていないので、2つの機能の違いを教えてください。

bool approximatelyEqual(float a, float b, float epsilon)
{
    return fabs(a - b) <= ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

bool essentiallyEqual(float a, float b, float epsilon)
{
    return fabs(a - b) <= ( (fabs(a) > fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}
4

3 に答える 3

14

例を挙げると:

double a = 95.1, b = 100.0;
assert( approximatelyEqual( a, b, 0.05 ) );
assert( !essentiallyEqual( a, b, 0.05 ) );

つまり、イプシロンが5%の場合、95.1は100の値(最大)の5%のマージン内に収まるため、約100になります。一方、100は95.1(最小値)との5%の差の範囲内ではないため、95.1は本質的に100ではありません。

于 2010-09-16T16:57:31.857 に答える
11

approximatelyEqualaとの差がb許容誤差()よりも小さいかどうかを示します。これは、またはepsilonの大きい方によって決定されます。これは、2つの値が「十分に近い」ことを意味し、ほぼ等しいと言えます。ab

essentiallyEqualaとの差がb許容誤差()よりも小さいかどうかを示します。これは、またはepsilonの小さい方によって決定されます。これは、値の差がどの計算でも許容できる差よりも小さいことを意味します。そのため、実際には等しくない可能性がありますが、「本質的に等しい」(が与えられた場合)。abepsilon

これは、データや「許容可能なエラー」率などがある問題に適用されます。このコードは、これらの用語のアルゴリズム定義を提供するだけです。

于 2010-09-16T16:47:30.007 に答える
5

違いは、本質的な平等は近似的な平等を意味しますが、その逆はないということです。したがって、本質的な平等は近似的な平等よりも強力です。

また、本質的な等式は推移的ではありませんが、aが本質的にに等しくbb本質的にに等しい場合caはほぼ等しくなりcます(イプシロンの別の値の場合)。

于 2010-09-16T16:59:30.230 に答える