Difference between revisions of "cpp/numeric/math/isnan"
(Note on interaction with -ffinite-math (and -ffast-math)) |
(Wording update.) |
||
Line 9: | Line 9: | ||
Another way to test if a floating-point value is NaN is to compare it with itself: {{c|1=bool is_nan(double x) { return x != x; }<!---->}}. | Another way to test if a floating-point value is NaN is to compare it with itself: {{c|1=bool is_nan(double x) { return x != x; }<!---->}}. | ||
− | [https://gcc.gnu.org/wiki/FloatingPointMath GCC] and [https://clang.llvm.org/docs/UsersManual.html#controlling-floating-point-behavior Clang] support a {{tt|-ffinite-math}} option (additionally implied by {{tt|-ffast-math}}), which allows the respective compiler to assume the nonexistence of special | + | [https://gcc.gnu.org/wiki/FloatingPointMath GCC] and [https://clang.llvm.org/docs/UsersManual.html#controlling-floating-point-behavior Clang] support a {{tt|-ffinite-math}} option (additionally implied by {{tt|-ffast-math}}), which allows the respective compiler to assume the nonexistence of special IEEE-754 floating point values such as NaN, infinity, or negative zero. In other words, {{tt|std::isnan}} is assumed to always return {{c|false}} under this option. |
− | + | ||
}} | }} | ||
Latest revision as of 19:39, 8 August 2023
Defined in header <cmath>
|
||
(1) | ||
bool isnan( float num ); bool isnan( double num ); |
(since C++11) (until C++23) |
|
constexpr bool isnan( /* floating-point-type */ num ); |
(since C++23) | |
Defined in header <cmath>
|
||
template< class Integer > bool isnan( Integer num ); |
(A) | (since C++11) (constexpr since C++23) |
Contents |
[edit] Parameters
num | - | floating-point or integer value |
[edit] Return value
true if num is a NaN, false otherwise.
[edit] Notes
There are many different NaN values with different sign bits and payloads, see std::nan and std::numeric_limits::quiet_NaN.
NaN values never compare equal to themselves or to other NaN values. Copying a NaN is not required, by IEEE-754, to preserve its bit representation (sign and payload), though most implementation do.
Another way to test if a floating-point value is NaN is to compare it with itself: bool is_nan(double x) { return x != x; }.
GCC and Clang support a -ffinite-math
option (additionally implied by -ffast-math
), which allows the respective compiler to assume the nonexistence of special IEEE-754 floating point values such as NaN, infinity, or negative zero. In other words, std::isnan
is assumed to always return false under this option.
The additional overloads are not required to be provided exactly as (A). They only need to be sufficient to ensure that for their argument num of integer type, std::isnan(num) has the same effect as std::isnan(static_cast<double>(num)).
[edit] Example
#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'; }
Output:
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
[edit] See also
(C++11)(C++11)(C++11) |
not-a-number (NaN) (function) |
(C++11) |
categorizes the given floating-point value (function) |
(C++11) |
checks if the given number has finite value (function) |
(C++11) |
checks if the given number is infinite (function) |
(C++11) |
checks if the given number is normal (function) |
(C++11) |
checks if two floating-point values are unordered (function) |
C documentation for isnan
|