web-dev-qa-db-ja.com

フロート値がNaNであるかどうかのテスト

重複の可能性:
C++でdouble(またはfloat)がnanであるかどうかを確認する

FloatがNaNかどうかを確認する必要があります。リンクのいくつかを通過することによって、私は最も一般的なチェックを見つけました。

FLOAT32 f32_test_NaN = (some_value);
if (f32_test_NaN == f32_test_NaN)
{
    //do something;
}
else
{
    // do something;
}

しかし、これは私にはうまくいかないようです。私のコードは次のとおりです。

FLOAT32 test_NaN = 0x414570A3;//some value - is this ok?

GDBでのデバッグ:

(gdb) p test_NaN
$1 = 1.09506982e+09

(gdb) p/x test_NaN
$2 = 0x41457080 // Hex is not same as init value - What is compiler doing?

したがって、私の場合、test_NaNtest_NaNと同じです。

コンパイラの設定が必要な場合はお知らせください。私はソラリスで走っています。または、同じことを確認する他の方法はありますか。

前もって感謝します。

13
kp11

問題はおそらく初期化にあります(少なくともそれはgdbに表示される値を説明しています):

FLOAT32 test_NaN = 0x414570A3;

指定された16進値は整数と見なされ、float(指数と値を含む)に変換されます。つまり、別の形式で格納されます。

フロート内のビットを強制したい場合は、memcpyする必要があります。

FLOAT32 test_NaN;
memcpy(&test_NaN, 0x414570A3, 4);
1
Benoit Thiery

_math.h_を含め、int isnan(x)を使用します。 _-lm_とリンクすることを忘れないでください

23
SiegeX

<math.h>が利用できない場合は、次のようにします。

if (x != x)
{
    // x is NaN
}
8

if(x!= x)

X = 0x7FBFFFFFの場合(符号ビット0、a = 0、残りのビット1)

http://en.wikipedia.org/wiki/NaN

IEEE浮動小数点標準単精度(32ビット)NaNのビット単位の例:s111 1111 1axx xxxx xxxx xxxx xxxx xxxxここで、sは符号、xはペイロード、aはNaNのタイプを決定します。 a = 1の場合、それは静かなNaNです。 aがゼロで、ペイロードがゼロ以外の場合、それはシグナリングNaNです。

6
user173973