在最新的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);
Run Code Online (Sandbox Code Playgroud)
这些宏来自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;
}
Run Code Online (Sandbox Code Playgroud)
Seb*_*ach 38
与关系运算符不同,这些宏实际上只返回一个布尔值,并且永远不会引发任何浮点异常.
简而言之:你只需处理true/ false而不是其他任何事情.
参考:
Open Group描述(不是C或C++标准,但在Unix/Linux世界中高度相关,几乎总是类似于标准):
C++标准:
C库[c.math]:
分类/比较函数的行为与C宏相同,其中相应的名称在7.1标准中的7.12.3,分类宏和7.12.14,比较宏中定义.对于三种浮点类型,每个函数都会重载,如下所示[...]
C标准:
7.12.14比较宏
[...]对于任何有序的数值对,其中一个关系 - less,greater和equal - 都是正确的.当参数值为NaN时,关系运算符可能会引发"无效"浮点异常.对于NaN和数值,或两个NaN,只有无序关系为真.以下子条款提供了关系运算符的安静(非浮点异常提升)版本的宏,以及其他比较宏,这些宏有助于编写考虑NaN的高效代码而不会遇到"无效"浮点异常.在本子条款的概要中,real-floating表示参数应为实数浮点类型的表达式.
eca*_*mur 13
isgreater等.从C99合并到C++ 11中.它们被定义为在x和/或y信令NaN值时不引发无效的浮点异常.
给出的理由是:
此宏是关系运算符的安静(非浮点异常提升)版本.它有助于编写考虑NaN的高效代码,而不会遇到无效的浮点异常.
宏的数值NaN与总是相同; NaN值将false与所有其他值(包括NaN所有关系运算符和新宏)下的值进行比较.
| 归档时间: |
|
| 查看次数: |
2673 次 |
| 最近记录: |