2012-07-09 12 views
13

二重比較を行うJavaライブラリはありますか?例: Javaの二重比較

public static boolean greaterThanOrEqual(double a, double b, double epsilon){ 
    return a - b > -epsilon; 
} 

私が始めたすべてのプロジェクトは、これを再実装してコードをコピーしてテストします。

NBは、その優れたサードパーティのJARを使用する理由の良い例が、IBMは以下のことをお勧めしていることである:

腹筋「あなたは テストを使用して、基礎となる測定のスケールがわからない場合は」 (A/B - 1)<イプシロンは、私は多くの人々が、この考えも簡単なコードは次善できることを示していることはないだろう

「単に 違いを比較するよりも堅牢である可能性が高いです」。

+0

私は従いません。あなたは本当に短いコード行で比較を行っています。なぜあなたはそれを方法で包む必要がありますか? – Thor84no

+0

なぜ2倍の比較をするライブラリが必要ですか?標準言語はすでにそうしているので意味がない。あなたの方法をJARに入れ、必要なときにそれをインポートして、完了します。 – m0skit0

+0

私はたくさんの異なる人のコードを書いています。私は知的財産の理由から同じJARを使うことはできません。また、常に私のコードがバグである可能性があります。 –

答えて

16

Guavaは、DoubleMath.fuzzyCompare()である。

+0

警告:Guavaの 'fuzzyCompare()'は、純粋な "最大絶対差"アプローチを使用しています。これは非常に信頼性が低く、浮動小数点に内包された丸めとキャンセルのために非常に限られた範囲の値に対してのみ機能します。私はそれを使用しません。詳細については、[この回答](http://stackoverflow.com/a/28751350/4610114)を参照してください。または(私の推奨)[この記事を読む](https://randomascii.wordpress.com/2012)/02/25/comparison-floating-point-numbers-2012-edition /)は、浮動小数点比較の明らかに単純な問題の複雑さを大いに紹介しています。 –

2

標準的なJavaライブラリでは、実際に問題を処理する方法はありません。私はあなたがヨアヒムのリンクをたどり、必要に応じてそのライブラリを使用することを提案します。私の提案は、あなたはこのに探して検討すべき問題の異なる実装のためとして、あなたはあなたの質問で述べてきた一人として頻繁に使用されるメソッドを追加することができます。

Java double comparison epsilon

その他のあいまいさを誘うお気軽に

2

あなたはどんなlib (グアバのような)素朴な「最大絶対差」アプローチを使用しています。 Bruce Dawsonの優れた記事Comparing Floating Point Numbers, 2012 editionに詳述されているように、非常に限られた値の範囲でしか機能しないため、エラーが発生しやすくなります。より堅牢な方法は、近似比較に相対差またはULPを使用することです。

私が知っている唯一のライブラリは正しい近似比較アルゴリズムを実装していますapache.common.mathです。