web-dev-qa-db-ja.com

C ++では、<、==、>のいずれか1つが浮動小数点数で真であることが保証されていますか?

C++では、任意のfloat aおよびfloat b、唯一のa < ba == bおよびa > bは本当ですか?

これがコンパイラとプラットフォーム間で異なる場合、x86上のVisual C++に興味があります。

47
MacMillan

番号。

_a < b_、_a == b_、および_a > b_がそれぞれfalseになるには、aまたはbNaNであれば十分です。

abの両方が非NaNの場合、_a < b_、_a == b_、または_a > b_のいずれか1つが真でなければなりません。

補足的に、この answer は、C++でaNaN値を取得する方法を示します(複数のNaN値があり、それらの表現を調べることで区別されます; NaNは決して決して等しくないため、それらはすべて異なっています)、そして値がNaNであるかどうかをテストする方法(変数xがNaNであるかどうかを確認する慣用的なテストは_x != x_、そして実際にstd::isnan()はこの方法で実装されることが多いですが、コードを読まなければならないプログラマーは混乱するかもしれません)。

そして、abが以前の計算の結果である場合、過剰な精度の問題があります。これを参照してください 記事 C99標準は、過剰な精度が発生する場合と発生しない場合についてルールを明示的にすることで問題を解決しましたが、C++ cfloatの_FLT_EVAL_METHOD_の定義の標準であるため、実際にはCコンパイラはC++コンパイラよりも規則を真剣に受け止めています。たとえば、GCCは_-std=c99_でコンパイルするときにCのルールを実装します。このコンテキストでは、保持するプロパティに依存できますが、この記事の執筆時点では、GCCはC++コンパイラとして使用する場合、これらのルールを実装していません。

76
Pascal Cuoq