何时使用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世界中高度相关,几乎总是与标准类似 ):
- http://pubs.opengroup.org/onlinepubs/009695399/functions/islessgreater.html
- http://pubs.opengroup.org/onlinepubs/009695399/functions/isgreater.html
- http://pubs.opengroup.org/onlinepubs/009695399/functions/isgreaterequal.html
- http://pubs.opengroup.org/onlinepubs/009695399/functions/isless.html
- http://pubs.opengroup.org/onlinepubs/009695399/functions/islessequal.html
- http://pubs.opengroup.org/onlinepubs/009695399/functions/islessgreater.html
- http://pubs.opengroup.org/onlinepubs/009695399/functions/isunordered.html
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。