何时使用C float比较函数?

BЈо*_*вић 35 c c++ c++11

在最新的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表示参数应为实数浮点类型的表达式.

  • 也就是说,除了相当无用的`isunordered`之​​外,我们_still_没有`std :: set <float>`的有效谓词.(参见http://stackoverflow.com/questions/4816156/are-ieee-floats-valid-key-types-for-stdmap-and-stdset why) (3认同)

eca*_*mur 13

isgreater等.从C99合并到C++ 11中.它们被定义为在x和/或y信令NaN值时不引发无效的浮点异常.

给出的理由是:

此宏是关系运算符的安静(非浮点异常提升)版本.它有助于编写考虑NaN的高效代码,而不会遇到无效的浮点异常.

宏的数值NaN与总是相同; NaN值将false与所有其他值(包括NaN所有关系运算符和新宏)下的值进行比较.