2017-02-01 4 views
49

C++では、float afloat bに対して、a < b,a == bおよびa > bのうちの1つのみがtrueであるという保証がありますか?C++では、ちょうど<, == and >のうちの1つが浮動小数点数で真となることが保証されていますか?

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

+28

フロートがNaNでない場合。 –

+1

コーナーケースを除外するには、これを 'NaN以外の浮動小数点値'に変更するのがよいでしょうか? – smci

+2

いいえ、**それらのうち最大** 1つは真であることが保証されています。 –

答えて

75

それは偽とa < bのそれぞれについてNaNa == ba > bするaまたはbのいずれかのために十分です。両方abが非NaNの場合

は正確にa < ba == bまたはa > bのいずれかに該当することがあります。補数で

、このanswerはあなたが彼らの表現を調べることによって識別することができるC++(いくつかのNaN値があり、中に NaN値を得ることができる方法を説明します。NaNで等しいことはありませんので、それらはすべて互いに異なっています値がNaNであるかどうかをテストする方法(変数xがNaNであるかどうかを調べるための慣用的なテスト)はx != xであり、実際にはstd::isnan()が実装されることが多いが、それによって混乱するかもしれない)。

そして、abが以前の計算の結果である場合、超過精度の問題があります。詳細については、articleを参照してください。C99の標準では、超過精度がどこで発生する可能性があるかどうかを明示するルールを明示することで問題を解決しましたが、C++には、 cfloat実際には、CコンパイラはC++コンパイラよりも真剣にルールを採用しています。たとえば、GCCは-std=c99でコンパイルするときにCの規則を実装します。この文脈では、保持するプロパティに依存することができますが、この記事の時点ではGCCはC++コンパイラとして使用されたときにこれらの規則を実装しません。

+0

'0.0/0.0'のようなものは__a__ NaNも取得できませんか? –

+0

@JeppeStigNielsenはい、それはヘッダーに頼らずに書く方法です。 –

+6

@JeppeStigNielsen:NaNの代わりにFPU例外を生成する可能性のあるFPU設定に応じて、 –

関連する問題