C/C++中的NaN比较规则

use*_*453 10 c c++ nan

对一段代码进行一些优化,代码的正确性取决于编译器如何处理NaN.

我阅读了关于NaN的IEEE-754规则,其中规定:

比较EQ,GT,GE,LT和LE,当其中一个或两个操作数为NaN时返回FALSE.

比较NE,当其中一个或两个操作数为NaN时返回TRUE.

上述规则是否在C/C++中实施?

Ale*_*exD 10

C/C++,不需要特定的浮点表示,并且不需要针对其进行任何比较NaNfalse.

在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.

  • 这有点误导。该问题并不是一般性地询问 IEC 559,而是询问该标准的一个特定方面,即使在忽略 IEC 559 的实现上,C 和 C++ 标准也可能会也可能不会直接保证这一点。 (2认同)

dxi*_*xiv 6

==!=运营商似乎被约束到IEEE 754的行为NaN已S,作为中指出@ AlexD的答案。

然而,<math.h>相比宏必须遵守NaN的规则等同于IEEE 754的。该从以下C11下14年7月12日N1580草案比较宏的状态<math.h>比较宏必须确保,如果一个或两个的x, yNaN当时的:

  • isunordered(x, y)true

  • isgreater(x, y)isgreaterequal(x, y)isless(x, y)islessequal(x, y)都是false

关系和相等运算符支持数值之间的常规数学关系。对于任何一个有序的对数值的关系只有一个- lessgreaterequal-是真的。当参数值为NaNs 时,关系运算符可能会引发“无效”浮点异常 。对于a NaN 和一个数值,或者对于两个NaNs,只是无序关系为true

C++标准仅C针对以下<math.h>方面:

分类/比较函数的行为与C宏相同,其相应名称在C标准中的7.12.3分类宏和7.12.14比较宏中定义。