精度の低下の可能性を無視して、2 つの double を比較できるようにしたいと考えています。このケースを処理するメソッドは既にありますか?
そうでない場合、2 つの double 間の適切な等価性を知るためのしきい値/ガイドラインはありますか?
精度の低下の可能性を無視して、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 は、これに適したイプシロン値ではないことに注意してください。これにより、最初の値の大きさに応じてスケーリングするイプシロンが作成されます。これはかなり役立ちます。