std::isnan
来自 cppreference.com
定义在头文件 <cmath> 中 |
||
(1) | ||
bool isnan( float num ); bool isnan( double num ); |
(自 C++11 起) (直至 C++23) |
|
constexpr bool isnan( /* 浮点类型 */ num ); |
(自 C++23 起) | |
定义在头文件 <cmath> 中 |
||
template< class Integer > bool isnan( Integer num ); |
(A) | (自 C++11 起) (自 C++23 起为 constexpr) |
1) 确定给定的浮点数 num 是否为非数字 (NaN) 值。 库为所有 cv 无限定浮点类型提供了重载,作为参数 num 的类型。(自 C++23 起)
A) 为所有整数类型提供附加重载,这些类型被视为 double.
内容 |
[编辑] 参数
num | - | 浮点或整数值 |
[编辑] 返回值
如果 num 为 NaN,则返回 true,否则返回 false.
[编辑] 备注
存在许多不同的 NaN 值,具有不同的符号位和有效载荷,请参见 std::nan 和 std::numeric_limits::quiet_NaN.
NaN 值从不与其自身或其他 NaN 值相等。根据 IEEE-754,复制 NaN 不需要保留其位表示(符号和 有效载荷),但大多数实现确实如此。
测试浮点值是否为 NaN 的另一种方法是将其与自身进行比较:bool is_nan(double x) { return x != x; }.
GCC 和 Clang 支持 -ffinite-math
选项(此外由 -ffast-math
隐式包含),这允许各自的编译器假设不存在特殊 IEEE-754 浮点值,例如 NaN、无穷大或负零。换句话说,在此选项下,假定 std::isnan
始终返回 false.
附加重载不需要完全按照 (A) 提供。它们只需要足够确保对于其整数类型的参数 num,std::isnan(num) 的效果与 std::isnan(static_cast<double>(num)) 相同。
[编辑] 示例
运行此代码
#include <cfloat> #include <cmath> #include <iostream> int main() { std::cout << std::boolalpha << "isnan(NaN) = " << std::isnan(NAN) << '\n' << "isnan(Inf) = " << std::isnan(INFINITY) << '\n' << "isnan(0.0) = " << std::isnan(0.0) << '\n' << "isnan(DBL_MIN/2.0) = " << std::isnan(DBL_MIN / 2.0) << '\n' << "isnan(0.0 / 0.0) = " << std::isnan(0.0 / 0.0) << '\n' << "isnan(Inf - Inf) = " << std::isnan(INFINITY - INFINITY) << '\n'; }
输出
isnan(NaN) = true isnan(Inf) = false isnan(0.0) = false isnan(DBL_MIN/2.0) = false isnan(0.0 / 0.0) = true isnan(Inf - Inf) = true
[编辑] 另请参阅
(C++11)(C++11)(C++11) |
非数字 (NaN) (函数) |
(C++11) |
对给定的浮点值进行分类 (函数) |
(C++11) |
检查给定的数字是否具有有限值 (函数) |
(C++11) |
检查给定的数字是否为无穷大 (函数) |
(C++11) |
检查给定的数字是否为正常数 (函数) |
(C++11) |
检查两个浮点值是否无序 (函数) |
C 文档 for isnan
|