次のような投稿を見てきました。
float と double の比較で最も効果的な方法は何ですか?
その他、関連記事多数。
私はd3jsライブラリで見ましたが、次の比較を使用しています:
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
これを C/C++ で と の比較に使用してもよろしいdouble
ですfloat
か?
次のような投稿を見てきました。
float と double の比較で最も効果的な方法は何ですか?
その他、関連記事多数。
私はd3jsライブラリで見ましたが、次の比較を使用しています:
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
これを C/C++ で と の比較に使用してもよろしいdouble
ですfloat
か?
次のコードで十分ですか?
いいえ。
そうでない場合、なぜですか?
==
それは(少なくともエッジ以外のケースでは)と同じだからです。
a または b のいずれかが NaN の場合に true を返すため、これは十分ではありません。
許容値と比較するという考え方は、ほとんど同じである 2 つの値を同じと見なしたい場合があるということです。と がある場合、それらは等しくなければなりませんか2.000000000000
? 2.000000000001
それらがそうである場合、コードは失敗します。
あなたの間違いは、次の記事を読んだことです。
diff = A - B;
return (diff < EPSILON) && (-diff > EPSILON);
そして、あなたはEPSILON = 0
それを入れて、
if (!(a > b) && !(a < b))
EPSILON
と考えるべきではありません0
。ビットエラーは float/double 比較であると考える必要があるため、これを と呼びますEPSILON
。
あなたは本当にこのドキュメントを読む必要があります:
https://ece.uwaterloo.ca/~dwharder/NumericalAnalysis/02Numerics/Double/paper.pdf
これは Golberg の論文です = すべてのプログラマーが浮動小数点について知っておくべきことです。