NaNからBoolへの変換:TrueまたはFalse?

C ++仕様のどの部分、またはIEEE float仕様でNaN値がfalseではなく true に変換されるべきであると述べていますか?

私がC ++の標準セクション 4.12ブール変換を見ると、

ゼロ値、ヌルポインタ値、またはヌルメンバポインタ値は   偽に変換される。それ以外の値はtrueに変換されます。

今IEEE floatは、NaNがfalseを他の値と比較していると言います。したがって、NaNが真か偽かにかかわらず、あなたの比較(以下)をどのように行うかによって異なります。したがって、私は明示的に言及しなければならないと推測します。

value == 0 ? false : true
value != 0 ? true : false

さて、整数への変換はどうですか?以下の短いプログラムは、整数に変換された変数NANが最小整数になり、定数が0に変換されることを示しています(GCCを使用)。これは奇妙に思える。

#include 
#include 

void write( double r, int i, bool b )
{
    std::cout << r << " == " <<  i << " == " << (b ? "True" : "False") << std::endl;
}

int main()
{
    double value = NAN;
    write( value, value, value );
    write( NAN, NAN, NAN );
}

出力:

nan == -2147483648 == True
nan == 0 == True

NaNをゼロに変換するが、Trueのように変換するのは面倒です。 MatLabは int16 のような関数を使ってNaNを0に変換するようなものではない。

したがって、NaNがどのようにブール値と整数値に変換するかを記述する関連標準の詳細は何ですか?

私はブール値の変換を定義していないかもしれませんが、それはおそらく完全な変換を定義して条件付きで使用するので、C ++は同じ規則に従います

17
奇妙なことに、Cのわずかな文言の違いは、ゼロとの比較について明示的であるため、そこでの問題を解決する可能性があります。すなわち、私の最初のフォーム value == 0? false:true
追加された 著者 edA-qa mort-ora-y,
Cは "スカラー値が_Boolに変換されると、値が0と等しい場合は0、それ以外の場合は結果は1"ですが、これはC99で追加され、C ++は bool は以前のタイプなので、C ++はそれをCからコピーできませんでした。これはC ++の限りでは答えではないので、答えとして投稿しません。
追加された 著者 hvd,
@MikeSeymourあなたが正しいです。 CおよびC ++では、 a!= b は常に!(a == b)です。私は 0 == NaN 0!= NaN の両方がfalseである他のシステムを考えていました。 0 <> NULL はSQLでは不明ですが、NaNのケースでは、結果として実際にはfalseであると考えていました)
追加された 著者 hvd,
そのシステムが何であるかを考えていても、私は全く覚えていないかもしれませんし、それを探しているものは何も見つかりません...
追加された 著者 hvd,
@ hvd: NAN は0に等しくないので、 NAN? a:b a を評価し、 if(NAN)a(); else b(); a を呼び出します。
追加された 著者 Mike Seymour,

1 答え

CとC ++の両方で、 NAN bool 以外の整数型に変換するときの動作は未定義です。

C99 6.3.1.4/1:実浮動型の有限値を _Bool 以外の整数型に変換すると、小数部は破棄されます(つまり、値はゼロに切り捨てられます) 。整数部分の値を整数型で表すことができない場合、動作は未定義です

     

C ++ 11 4.9/1:浮動小数点型のprvalueは整数型のprvalueに変換できます。変換は切り詰められます。つまり、端数部分は破棄されます。トランケートされた値を宛先タイプで表現できない場合は、動作は未定義です。 [注:宛先タイプが bool の場合は、4.12を参照してください。 エンドノート]

どちらの言語でも NAN bool (または _Bool )に変換すると true コード>):

C99 6.3.1.2/1:スカラー値が _Bool に変換されると、その値が0に等しいと比較された場合、結果は0になります。それ以外の場合、結果は1です。

     

C ++ 11 4.12/1:ゼロ値、ヌルポインタ値、またはヌルメンバポインタ値は false に変換されます。他の値は true に変換されます。

NAN is not a zero value, and doesn't compare equal to zero.

19
追加された
@stewart:あなたのコメントを他の誰かが読んだ場合、2年後にあなたの反対に返信する。 StdC sect 5.2.4.2.2 para 3(強調表示):「浮動小数点数にNaNなどの浮動小数点数ではない浮動小数点数には... を含めることができます。
追加された 著者 rici,
@スチュワート:私は決断がどちらかの道を行くことができたと思う、そして何年もの間、本当にディスカッションの性質を知ることは難しい。恐らく今日は、浮動小数点がブール値に自動的に変換されないようにすることで、プログラマがNaNの変換方法を明示しなければならないかもしれません。おそらくislessgreaterやisunorderedを使用します。
追加された 著者 rici,
しかし、NaNは全く価値を構成しますか?典型的なデータベースシステムではNULLに似ています。私は、NULLが値ではなく、値が存在しないことを明示的に教えていました。逆の証拠がない限り、私はNaNについても同じことを主張することができます。そのため、私は、この問題を扱う仕様のどこかに何かがない限り、変換されたNaNの動作を未定義のboolにしておくと主張します。
追加された 著者 Stewart,
@心配しています。したがって、これらのステートメントはまとめて、 NaN true としてブール値に変換されると効果的に言いますが、これは設計上の決定ではなく見落としているようです。
追加された 著者 Stewart,