私の素朴な印象は、ある程度の耐性イプシロンに対して常に違いをテストするということです。私が間違っている?フロートの等価性をテストすることは、特定のコンテキストで意味がありますか?
ユニークなレシピはありません。で、この記事あなたは、技術とコードとの完全な答えを見つけることができる包括的治療は、そこにあります。
要約すると、主に3つのケースがあります。
- ゼロと比較
- ゼロ以外と比較
- 2つの任意の数値を比較する
許容値との比較を使用するというあなたのアイデアは、いくつかのケースに適していますが、記事の中で説明されている最後の場所にあるUnit(ULP)に基づくテクニックもあります。
浮動小数点数で等値演算子を使用することは、一部のコンテキストでは実際に意味があると想定しています。そうでなければ、ほとんどのプログラミング言語がそれを許可する理由。
上記のように、それを使用できる状況がありますが、警告されます。たとえば、gccコンパイラには警告があります。
warning: comparing floating point with == or != is unsafe
更新
この議論の上にいくつかの考慮事項を追加しa == b
ます。それらはケースに厳密に関連していません。
表現との平等
ケースを考える:
a + b == c
a b c
⊕ Bfl( fl(a)+ fl(b))= = c= = fl(c)
|||aa + b|||e r ra+ ∣||ba + b|||e r rb
e r rバツ= | x − fl(x)|| x |
したがって、この場合、の使用==
はよりデリケートです。
異なる環境での移植
異なる環境(異なるマシン)にコードを移植すると、いくつかの異なる結果を得ることができます(たとえば、単体テストを考えてみてください)。==
デリケートな場合もございます。