2011-01-20 15 views
10

可能性の重複の場合:
Checking if a double (or float) is nan in C++テストFloat値がNaN

フロートがNaNであれば、私がチェックする必要があります。いくつかのリンクを調べることで、私は最も一般的なチェックを見つけました。

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

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

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

デバッグ:

(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に等しいです。

コンパイラの設定が必要かどうかお知らせください。私はsolarisで走っています。または、それを確認する他の方法がありますか?

ありがとうございます。

+1

http://stackoverflow.com/questions/570669/checking-if-a-double-or-float-is-nan-in -c –

+3

なぜisnan()をmath.hから使用しないのですか?特別な理由はありますか? – Constantin

+0

この標準機能は、環境では使用できません。 – kp11

答えて

1

問題は(少なくとも、あなたはGDBに表示値を説明している)あなたの初期化中に多分ある:

FLOAT32 test_NaN = 0x414570A3; 

与えられた16進値は整数とみなされ、異なる形式で格納されていることを意味するfloat(指数と値付き)に変換されます。あなたはフロート内のビットを強制したい場合は

、その後、あなたはmemcpyをする必要があります(!X = x)の

FLOAT32 test_NaN; 
memcpy(&test_NaN, 0x414570A3, 4); 
+0

クール!!私はそこに問題があることを知っていた。しかし、memcpyは私のためにクラッシュした。それはちょうどこれをしたと働いた! UINT32 test_NaN [2] = {0xffffffff、0xfffffff7}; FLOAT32 test = *(FLOAT32 *)test_NaN;(コメントにポインタを表示しない(?!?) – kp11

+2

コードが正しくありません。 memcpyはアドレスからコピーする必要があります。したがって、最初にint変数に0x414570A3を格納してください。 – Calmarius

22

math.hを含み、int isnan(x)を使用してください。 <math.h>が利用できない場合は、これを行う、-lm

+1

おそらくC99にこの "only"が追加されているはずですので、すべてのコンパイラがこれを実装するわけではありません。 –

+1

sunccはそれをサポートしています。これは質問者が使用しているようです。 –

+0

実際には 'isnan'は関数ではありません。少なくとも、' math.h'をインクルードして使用すると、実装定義の定義を持つマクロです。 – Ruslan

6

にリンクすることを忘れないでください:

if (x != x) 
{ 
    // x is NaN 
} 
+0

ありがとう、その私はやっているが、おそらく私は正しく初期化されていません。 NaNをテストするために「x」を初期化できる値を教えてください。 – kp11

+0

@kartik: 'x = 0.0; x/= x; ' –

6

場合については

のx = 0x7FBFFFFF(符号ビット0、= 0、ビット1)の残り

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

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