質問

精度の損失を無視して、2つのdoubleを比較できるようにしたい。このケースを処理するメソッドはすでにありますか?

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

役に立ちましたか?

解決

しきい値は問題自体に完全に依存しています。一部の問題では、1.001が1.002に等しいと見なされる場合があり、一部の問題では、より小さなしきい値が必要になる場合があります。

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

Math.Abs(a - b) < some_epsilon    // `a` is roughly equivalent to `b`

他のヒント

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

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は、これに適したイプシロン値ではないことに注意してください。これにより、最初の値の大きさに応じて多少スケーリングするイプシロンが作成され、かなり役立ちます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top