1

精度の低下の可能性を無視して、2 つの double を比較できるようにしたいと考えています。このケースを処理するメソッドは既にありますか?

そうでない場合、2 つの double 間の適切な等価性を知るためのしきい値/ガイドラインはありますか?

4

2 に答える 2

6

しきい値は、問題自体に完全に依存しています。問題によっては、1.001 を 1.002 と見なす場合もあれば、はるかに小さいしきい値が必要な場合もあります。

一般的なテクニックは次のとおりです。

Math.Abs(a - b) < some_epsilon    // `a` is roughly equivalent to `b`
于 2009-07-29T20:41:15.023 に答える
3

これに対する非常に優れた完全なオプションは次のとおりです。

public static bool DoubleEquality(double a, double b) 
{
    const double epsilonValue = 1e-15;
    if (double.IsNaN(a))
        return double.IsNaN(b);
    else if (double.IsInfinity(a))
        return double.IsInfinity(b);
    else if (a == 0) 
        return b == 0;
    else
        return Math.Abs(a - b) <= Math.Abs(a * epsilonValue);
}

Double.Epsilon は、これに適したイプシロン値ではないことに注意してください。これにより、最初の値の大きさに応じてスケーリングするイプシロンが作成されます。これはかなり役立ちます。

于 2009-07-29T20:51:33.643 に答える