我需要检查浮点数是否为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
。
如果必须进行任何编译器设置,请告诉我。我在solaris上运行。或者还有其他方法可以检查相同的内容。
提前致谢。
答案 0 :(得分:23)
包括math.h
并使用int isnan(x)
。不要忘记链接-lm
答案 1 :(得分:8)
如果<math.h>
不可用,请执行以下操作:
if (x != x)
{
// x is NaN
}
答案 2 :(得分:6)
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
答案 3 :(得分:1)
问题可能在于您的初始化(至少可以解释您在gdb中看到的值):
FLOAT32 test_NaN = 0x414570A3;
给定的十六进制值被视为一个整数并转换为float(带指数和值),这意味着它以不同的格式存储。
如果要强制浮点内的位,则需要memcpy:
FLOAT32 test_NaN;
memcpy(&test_NaN, 0x414570A3, 4);