2011-12-10 2 views
1

を私はあなたがダブルスのための等価性をチェックしたい場合はあなたが行うことを知っている:! return abs(a-b)<EPSILON2倍が等しくないかどうかを尋ねる - = B

私の質問は:私が欲しいときEPSILONとその比較も必要とされていますa!=bかどうか尋ねる?私たちは等価性をチェックしたいとき 私の直感は、(それらが等しい可能性があるため)そう言うが、私はウェブ上で見たものから、それはEPSILON

と1つの以上の質問で実装されていない、我々はEPSILONを使用する理由は何ですダブルスやフロートで?

答えて

1

おそらく2倍を比較するための最も一般的な方法は、以下の(C++コード)であります計算中に、キャンセル、有限精度表現などのエラーが発生する可能性があります(詳細はWhat Every Computer Scientist Should Know About Floating-Point Arithmeticを参照してください)

#include <algorithm> 
#include <cmath> 
#include <limits> 
bool almostEqual(double const a, double const b) 
{ 
    double const diff = sta::abs(a - b); 
    double const toll = std::max(std::abs(a), std::abs(b)) * 
         std::numeric_limits<double>::epsilon(); 
    return diff < toll; 
} 

次に、2つのdoubleがほぼ等しくない場合は異なるので、a!=b!almostEqual(a,b)になります。

3

浮動小数点数はで、常にではないため、イプシロンを使用します。 1/3を10進数として正確に表すことはできません。 0.1を正確に2進数で表すことはできません。

イプシロンとの差の絶対値で十分であることを確認してください。他に何も必要ありません。

thisとお読みください。

+3

**あなたは**記事を読んでいませんでしたか?引用:「ちなみに、このような異常の解決策は、浮動小数点数を平等のために比較するのではなく、いくつかの誤差範囲E内にあればそれらを等しいとみなすことを考える人もいると思います。 ** Eの価値はどうあるべきですか?x < 0 and y > 0がEの範囲内にあれば、それらが異なる符号を持っていても、実際には等しいとみなされるべきですか?さらに、これによって定義される関係a〜b | a-b | UncleBens

+1

私は"浮動小数点数は正確ではありません "という言葉には同意しません。浮動小数点数**は**正確ですが、すべての実数を表すことはできません。 –

+0

あなたは正しいです。私はそれを修正するだろう、オリ。 – duffymo

0

にはがありません。不正確な表現、精度誤差の累積などのために、ほぼ確実に望みます。相対誤差と絶対誤差の良い議論here

0

フロート/ダブル平等のチェック:イン・平等ダブルフロート/のチェック

abs(a - b) <= EPSILON 

abs(a - b) > EPSILON 
関連する問題