36

在最新的 C++ 标准中,我注意到以下宏:

bool isgreater(float x, float y);
bool isgreaterequal(float x, float y);
bool isless(float x, float y);
bool islessequal(float x, float y);
bool islessgreater(float x, float y);
bool isunordered(float x, float y);

这些宏来自 C(7.12.14 和 7.12.14)。

那么,为什么有人会使用这些宏而不是运算符呢?这些宏有什么特别之处吗(比如检查inf),或者它们与对应的运算符相同吗?

C++ 示例:

#include <iostream>
#include <cmath>

int main()
{
  float x=0.2;
  float y=0.5;
  std::cout << x << " < " << y << " : " << std::boolalpha << std::islessequal( x, y ) << std::endl;
  std::cout << x << " < " << y << " : " << std::boolalpha << ( x <= y ) << std::endl;
}
4

2 回答 2

38

与关系运算符不同,这些宏实际上只返回一个布尔值,并且从不引发任何浮点异常。

简而言之:您只需要处理true/false就不需要别的了。


参考资料

Open Group描述(不是 C 或 C++ 标准,但与 Unix/Linux 世界高度相关,几乎总是与标准相似):

C++标准:

C 库 [c.math]:

分类/比较函数与 C 标准中 7.12.3,分类宏和 7.12.14,比较宏中定义的相应名称的 C 宏相同。每个函数都为三种浮点类型重载,如下 [...]

C标准:

7.12.14 比较宏

[...] 对于任何有序的数值对,其中一个关系——小于、大于和等于——是正确的。当参数值为 NaN 时,关系运算符可能会引发“无效”浮点异常。对于一个 NaN 和一个数值,或者对于两个 NaN,只有无序关系是 true。以下子条款提供了关系运算符的安静(非浮点异常引发)版本的宏,以及其他比较宏,这些宏有助于编写有效的代码来解释 NaN 而不会遭受“无效”浮点异常。在本小节的概要中,real-floating 表示参数应为实浮点类型的表达式。

于 2012-08-06T10:18:27.107 回答
13

isgreater等。从 C99 并入 C++11。x它们被定义为在和/或y信号NaN值时不引发无效浮点异常。

给出的理由是:

此宏是关系运算符的安静(非浮点异常引发)版本。它有助于编写有效的代码来解释 NaN,而不会遭受无效的浮点异常。

宏 on 的数值NaN和往常一样;NaNvalues 将 false 与所有其他值进行比较,包括NaN所有关系运算符和新宏下的值。

于 2012-08-06T10:22:01.037 回答