浮動小数点数が等しいかどうか比較できないという一般的な知識は不正確です。浮動小数点数は整数と同じです。 "a == b"を評価すると、それらが同じ数の場合はtrueになり、それ以外の場合はfalseになります(2つのNaNはもちろん同じ数ではないことを理解しています)。
実際の問題は次のとおりです。いくつかの計算を実行し、比較する必要がある2つの数値が正確に正しいかどうかわからない場合は、どうすればよいですか。この問題は、整数の場合と同様に、浮動小数点の場合にも同じです。整数式「7/3 * 3」を評価すると、「7 * 3/3」と比較されません。
それで、「整数を等しいかどうか比較するにはどうすればよいですか?」そのような状況で。単一の答えはありません。何をすべきかは、特定の状況、特にどのようなエラーがあり、何を達成したいかによって異なります。
可能な選択肢は次のとおりです。
数学的に正確な数値が等しい場合に「真」の結果を取得するには、実行する計算のプロパティを使用して、2つの数値で同じエラーが発生することを証明することができます。それが可能であり、正確に計算された場合に等しい数値を与える式から生じる2つの数値を比較すると、比較から「true」が得られます。別のアプローチは、計算のプロパティを分析し、エラーが特定の量、絶対量または入力または出力の1つに対する相対量を超えないことを証明することです。その場合、2つの計算された数値が最大でその量だけ異なるかどうかを確認し、それらが間隔内であれば「true」を返すことができます。エラー限界を証明できない場合は、あなたは推測して最高のものを期待するかもしれません。推測する1つの方法は、多数のランダムサンプルを評価し、結果にどのような分布が表示されるかを確認することです。
もちろん、数学的に正確な結果が等しい場合にのみ「true」を取得するという要件を設定しているため、それらが等しくなくても「true」を取得する可能性はあります。(実際には、常に「true」を返すことで要件を満たすことができます。これにより、計算は簡単になりますが、一般的には望ましくないため、以下の状況の改善について説明します。
数学的に正確な数値が等しくない場合に「偽」の結果を取得したい場合、数学的に正確な数値が等しくない場合に、数値の評価が異なる数値をもたらすことを証明する必要があります。これは、多くの一般的な状況での実用的な目的には不可能かもしれません。そこで、代替案を検討しましょう。
有用な要件は、数学的に正確な数値が一定量以上異なる場合に「偽」の結果が得られることです。たとえば、コンピューターゲームで投げられたボールがどこを移動したかを計算し、それがバットを打ったかどうかを知りたいとします。この場合、ボールがバットに当たった場合は必ず「true」を取得し、ボールがバットから遠い場合は「false」を取得します。ボールが入っている場合、誤った「true」の回答を受け入れることができます。数学的に正確なシミュレーションはコウモリを逃しましたが、コウモリを打ってから1ミリ以内です。その場合、ボールの位置とバットの位置の計算に、最大で1ミリの誤差(すべての対象位置)があることを証明(または推測/推定)する必要があります。これにより、常に戻ることができます」
したがって、浮動小数点数を比較するときに何を返すかを決定する方法は、特定の状況に大きく依存します。
計算の誤差範囲をどのように証明するかについては、複雑な問題になる可能性があります。最も近い丸めモードでIEEE 754標準を使用する浮動小数点の実装は、基本的な演算(特に、乗算、除算、加算、減算、平方根)の正確な結果に最も近い浮動小数点数を返します。(同数の場合、丸めるので下位ビットが偶数になります。)(平方根と除算には特に注意してください。言語の実装では、IEEE 754に準拠していないメソッドを使用する可能性があります。)この要件により、 1つの結果のエラーは、最下位ビットの値の最大で1/2です。(それ以上の場合、丸めは値の1/2以内の別の数値になります。)
そこから先に進むと、かなり複雑になります。次のステップは、入力の1つにすでにエラーがある操作を実行することです。単純な式の場合、これらのエラーは、最終的なエラーの限界に到達するための計算をたどることができます。実際には、これは、高品質の数学ライブラリで作業するなど、いくつかの状況でのみ行われます。そしてもちろん、実行する操作を正確に制御する必要があります。高水準言語は、コンパイラに多くの余裕を与えることが多いため、操作が実行される順序がわからない場合があります。
このトピックについて書かれている可能性がある(そして書かれている)ものはまだたくさんありますが、私はそこで止めなければなりません。要約すると、答えは次のとおりです。ライブラリルーチンに入れる価値のあるほとんどのニーズに適合する単一のソリューションがないため、この比較のためのライブラリルーチンはありません。(相対または絶対エラー間隔との比較で十分であれば、ライブラリルーチンなしで簡単に実行できます。)