对一段代码进行一些优化,代码的正确性取决于编译器如何处理NaN.
我阅读了关于NaN的IEEE-754规则,其中规定:
比较EQ,GT,GE,LT和LE,当其中一个或两个操作数为NaN时返回FALSE.
比较NE,当其中一个或两个操作数为NaN时返回TRUE.
上述规则是否在C/C++中实施?
Ale*_*exD 10
C/C++,不需要特定的浮点表示,并且不需要针对其进行任何比较NaN
是false
.
在C++中,您可以使用以下命令检查所有浮点类型是否符合IEEE 754 std::numeric_limits::is_iec559
:
static constexpr bool is_iec559;
56当且仅当类型符合IEC 559标准时才为真.217
57对所有浮点类型都有意义.
217)国际电工委员会标准559与IEEE 754相同.
对于其他浮点表示,NaN
可能会或可能不会以相同的方式进行比较.
事实上,甚至NaN
不需要代表自己.见std::numeric_limits<T>::has_quiet_NaN
,
std::numeric_limits<T>::has_signaling_NaN
.
在==
与!=
运营商似乎不被约束到IEEE 754
的行为NaN
已S,作为中指出@ AlexD的答案。
然而,<math.h>
相比宏都必须遵守NaN
的规则等同于IEEE 754
的。该从以下C11
下14年7月12日N1580草案比较宏的状态<math.h>
比较宏都必须确保,如果一个或两个的x, y
是NaN
当时的:
isunordered(x, y)
是 true
isgreater(x, y)
,isgreaterequal(x, y)
,isless(x, y)
,islessequal(x, y)
都是false
关系和相等运算符支持数值之间的常规数学关系。对于任何一个有序的对数值的关系只有一个-
less
,greater
和equal
-是真的。当参数值为NaN
s 时,关系运算符可能会引发“无效”浮点异常 。对于aNaN
和一个数值,或者对于两个NaN
s,只是无序关系为true。
该C++
标准仅C
针对以下<math.h>
方面:
分类/比较函数的行为与C宏相同,其相应名称在C标准中的7.12.3分类宏和7.12.14比较宏中定义。