# std::isnan

< cpp‎ | numeric‎ | math

定义于头文件 `<cmath>` |  |
bool isnan( float arg ); | (1) | (C++11 起)
bool isnan( double arg ); | (2) | (C++11 起)
bool isnan( long double arg ); | (3) | (C++11 起)
bool isnan( IntegralType arg ); | (4) | (C++11 起)

1-3) 确定给定的浮点数 `arg` 是否为非数（ NaN ）值。
4) 接受任何整数类型 `arg` 参数的重载集或函数模板。等价于 (2) （将参数转型为 double ）。

### 参数

arg | - | 浮点值

### 返回值

若 `arg` 为 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; }

### 示例

    #include <iostream>
    #include <cmath>
    #include <cfloat>

    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

### 参阅

nan nanf nanl (C++11)(C++11)(C++11) | 非数（NaN） (函数)
fpclassify (C++11) | 归类给定的浮点值 (函数)
isfinite (C++11) | 检查给定数是否拥有有限值 (函数)
isinf (C++11) | 检查给定数是否为无限 (函数)
isnormal (C++11) | 检查给定数是否正规 (函数)
isunordered (C++11) | 检查两个浮点值是否无顺序 (函数)