何时使用C float比较函数?

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

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); 

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

那么,为什么有人会使用这些macros而不是操作符? 这些macros是否有什么特别之处(比如检查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; } 

与关系运算符不同,这些macros确实只返回一个布尔值,并且不会产生任何浮点exception。

简而言之:你只需要处理true / false而不是别的。


参考

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

C ++标准:

C图书馆[c.math]:

分类/比较函数的行为与在C标准中使用7.12.3分类macros和7.12.14macros比较中定义的相应名称的Cmacros相同。 每个函数都为三种浮点types重载,如下所示:

C标准:

7.12.14比较macros

[…]对于任何有序的数值对来说,其中一个关系 – 更less,更大和相等 – 是正确的。 当参数值是NaN时,关系运算符可能会引发“无效的”浮点exception。 对于一个NaN和一个数值,或者对于两个NaN,只是无序的关系是真的 。 下面的小节提供了静态(非浮点exception引发)版本的关系运算符的macros,以及其他一些比较macros,它们有助于编写高效的NaN代码,而不会遇到“无效的”浮点exception 。 在本小节的概要中,实际浮动表示参数应该是实际浮动types的expression式。

isgreater等。 从C99被合并到C ++ 11中。 它们被定义为当x和/或y发信号NaN值时不会引发无效的浮点exception。

理由是:

这个macros是一个关系运算符的安静(非浮点exception提升)版本。 它有助于编写高效的代码来解决NaN而不会遇到无效的浮点exception。

NaN上macros的数值与往常一样; NaN值将所有其他值(包括所有关系运算符下的NaN值)和新macros比较为false。