2009-07-29 12 views
1

私は、可能な精度の損失を無視して2倍を比較できるようにしたいです。このケースを処理するメソッドは既にありますか?浮動小数点等価?

ない場合は、2倍の間に十分な同値でどのくらい知っているしきい値/ガイドラインはありますか?

答えて

6

閾値は、問題自体に完全に依存しています。いくつかの問題については、1.001を1.002とみなし、いくつかの問題については、はるかに小さいしきい値を必要とするかもしれません。

一般techiqueは次のようになります。このため

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

これは良いですが、some_epsilonのための合理的な値を選ぶことは難しいです。 –

+0

それは本当に難しいことです。一般的な推奨事項はありません。個人的に、私はACM/ICPCジオメトリ質問と解空間の探索バイナリを必要とするもので、そのtrickinessを経験しました。 –

3

非常に良い、徹底したオプションは次のとおりです。Double.Epsilonは、このための良いイプシロン値ではありません

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); 
} 

注意。これは、あなたの最初の値の大きさに比例して少し大きくなるイプシロンを作成します。これはかなり役に立ちます。

+0

+1、しかしあなたの関数の標準的な等式(NaN!= NaN)の違いに気づく価値はありますか? – ShuggyCoUk

+0

ああ、正と負の無限大を等しいと見なしたいですか? – ShuggyCoUk

+0

うん - それはあなたの条件に応じて、いくつかの余分なチェックを追加するのは簡単です。私はまた、時には0チェックを取り出しましたが、最後の行を少し変更する必要があります。 (現在、0!= 1e-20、これはあなたが同等であることを望むかもしれません)。 –

関連する問題