C++では、任意のfloat a
およびfloat b
、唯一のa < b
、a == b
およびa > b
は本当ですか?
これがコンパイラとプラットフォーム間で異なる場合、x86上のVisual C++に興味があります。
番号。
_a < b
_、_a == b
_、および_a > b
_がそれぞれfalseになるには、a
またはb
がNaN
であれば十分です。
a
とb
の両方が非NaNの場合、_a < b
_、_a == b
_、または_a > b
_のいずれか1つが真でなければなりません。
補足的に、この answer は、C++でaNaN値を取得する方法を示します(複数のNaN値があり、それらの表現を調べることで区別されます; NaNは決して決して等しくないため、それらはすべて異なっています)、そして値がNaNであるかどうかをテストする方法(変数x
がNaNであるかどうかを確認する慣用的なテストは_x != x
_、そして実際にstd::isnan()
はこの方法で実装されることが多いですが、コードを読まなければならないプログラマーは混乱するかもしれません)。
そして、a
とb
が以前の計算の結果である場合、過剰な精度の問題があります。これを参照してください 記事 C99標準は、過剰な精度が発生する場合と発生しない場合についてルールを明示的にすることで問題を解決しましたが、C++ cfloat
の_FLT_EVAL_METHOD
_の定義の標準であるため、実際にはCコンパイラはC++コンパイラよりも規則を真剣に受け止めています。たとえば、GCCは_-std=c99
_でコンパイルするときにCのルールを実装します。このコンテキストでは、保持するプロパティに依存できますが、この記事の執筆時点では、GCCはC++コンパイラとして使用する場合、これらのルールを実装していません。