Isunordered
定义于头文件 <cmath>
中。
描述
确定浮点数x
和y
是否无序,即其中一个或两个都是NaN
,因此无法进行有意义的相互比较。
库为所有 cv 非限定浮点类型提供了重载,作为参数x
和y
的类型 (从 C++23 开始)。
声明
- C++23
- C++11
// 1)
constexpr bool isunordered( /* floating-point-type */ x,
/* floating-point-type */ y );
// 2)
template< class Arithmetic1, class Arithmetic2 >
constexpr bool isunordered( Arithmetic1 x, Arithmetic2 y );
// 1)
bool isunordered( float x, float y );
// 2)
bool isunordered( double x, double y );
// 3)
bool isunordered( long double x, long double y );
// 4)
template< class Arithmetic1, class Arithmetic2 >
bool isunordered( Arithmetic1 x, Arithmetic2 y );
参数
x
, y
- 浮点或整数值
返回值
如果x
或y
为NaN
,则为true
,否则为false
。
备注
浮点数的内置运算符>
和运算符<
可能会在其中一个或两个参数为NaN
时引发FE_INVALID
。此函数是表达式x < y || x > y
的“安静”版本。
不需要严格按照 附加重载 提供附加重载。它们只需要足以确保对于它们的第一个参数 num1
和第二个参数 num2
如果 num1
或 num2
的类型是 long double,则
std::isunordered(num1, num2)
与以下效果相同:
std::isunordered(static_cast<long double>(num1), static_cast<long double>(num2))
。
否则,如果 num1
和/或 num2
的类型是 double 或整数类型,则
std::isunordered(num1, num2)
与以下效果相同:
std::isunordered(static_cast<double>(num1), static_cast<double>(num2))
。
否则,如果num1
或num2
的类型为float,则std::isunordered(num1, num2)
具有与
std::isunordered(static_cast<float>(num1), static_cast<float>(num2))
相同的效果。 (直到 C++23)
如果 num1
和 num2
具有算术类型,则
std::isunordered(num1, num2)
与以下效果相同:
std::isunordered(static_cast</* common-floating-point-type */>(num1), static_cast</* common-floating-point-type */>(num2))
,
其中/* common-floating-point-type */是num1
和num2
类型之间浮点转换等级最高且浮点转换子等级最高的浮点类型,整数类型的参数被认为具有与double相同的浮点转换等级。
如果不存在具有最高等级和子等级的浮点类型,则重载决议不会从提供的重载中产生可用的候选。
示例
#include <cmath>
#include <iostream>
#define SHOW_UNORDERED(x, y) \
std::cout
<< std::boolalpha << "isunordered(" \
<< #x << ", " << #y << "): " \
<< std::isunordered(x, y) << '\n'
int main()
{
SHOW_UNORDERED(10, 01);
SHOW_UNORDERED(INFINITY, NAN);
SHOW_UNORDERED(INFINITY, INFINITY);
SHOW_UNORDERED(NAN, NAN);
}
isunordered(10, 01): false
isunordered(INFINITY, NAN): true
isunordered(INFINITY, INFINITY): false
isunordered(NAN, NAN): true