测试浮点值是不是为 NaN [重复]
Posted
技术标签:
【中文标题】测试浮点值是不是为 NaN [重复]【英文标题】:Testing if Float value is NaN [duplicate]测试浮点值是否为 NaN [重复] 【发布时间】:2011-06-12 06:43:57 【问题描述】:可能重复:Checking if a double (or float) is
nan
in C++
我需要检查 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
。
如果需要进行任何编译器设置,请告诉我。我在solaris上运行。或者有没有其他方法可以检查。
提前致谢。
【问题讨论】:
***.com/questions/570669/… 为什么不使用 math.h 中的isnan()
?有什么特别的原因吗?
该标准功能在环境中不可用。
不是骗子——这是关于 C,而不是 C++
标题可能具有误导性——它是关于一个所谓的nan
不是nan
毕竟。
【参考方案1】:
包括math.h
并使用int isnan(x)
。不要忘记链接-lm
【讨论】:
也许应该补充一点,这个“唯一”出现在 C99 中,所以并不是所有的编译器都可以实现这个。 suncc 支持它,这似乎是提问者使用的。 其实isnan
不是一个函数,至少在包含math.h
之后使用它时:它是一个具有实现定义定义的宏。【参考方案2】:
如果<math.h>
不可用,则执行以下操作:
if (x != x)
// x is NaN
【讨论】:
谢谢,我正在做同样的事情,但可能我没有正确初始化。你能告诉我我可以用什么值来初始化 'x' 来测试 NaN 吗? @kp11 任何浮点表达式都可以。【参考方案3】:如果 (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
【讨论】:
【参考方案4】:问题可能出在您的初始化中(至少这解释了您在 gdb 中看到的值):
FLOAT32 test_NaN = 0x414570A3;
给定的十六进制值被视为整数并转换为浮点数(带有指数和值),这意味着它以不同的格式存储。
如果你想强制浮动里面的位,那么你需要memcpy:
FLOAT32 test_NaN;
memcpy(&test_NaN, 0x414570A3, 4);
【讨论】:
酷!我知道问题在那里。但是 memcpy 为我崩溃了。因此,就是这样做了,它奏效了!! UINT32 test_NaN[2] = 0xffffffff,0xfffffff7; FLOAT32 test = ( FLOAT32 )test_NaN;(没有在 cmets 中显示指针 (?!?)) 您的代码不正确。 memcpy 必须从地址复制。所以首先将 0x414570A3 存储在一个 int 变量中。以上是关于测试浮点值是不是为 NaN [重复]的主要内容,如果未能解决你的问题,请参考以下文章