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_NaN
はtest_NaN
と同じです。
コンパイラの設定が必要な場合はお知らせください。私はソラリスで走っています。または、同じことを確認する他の方法はありますか。
前もって感謝します。
問題はおそらく初期化にあります(少なくともそれはgdbに表示される値を説明しています):
FLOAT32 test_NaN = 0x414570A3;
指定された16進値は整数と見なされ、float(指数と値を含む)に変換されます。つまり、別の形式で格納されます。
フロート内のビットを強制したい場合は、memcpyする必要があります。
FLOAT32 test_NaN;
memcpy(&test_NaN, 0x414570A3, 4);
_math.h
_を含め、int isnan(x)
を使用します。 _-lm
_とリンクすることを忘れないでください
<math.h>
が利用できない場合は、次のようにします。
if (x != x)
{
// x is NaN
}
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です。