Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/numeric/math/isnan"

From cppreference.com
< cpp‎ | numeric‎ | math
(link to c too)
(detail, example)
Line 3: Line 3:
 
{{dcl begin}}
 
{{dcl begin}}
 
{{dcl header | cmath}}
 
{{dcl header | cmath}}
{{dcl | since=c++11 |
+
{{dcl | since=c++11 | num=1 |
 
bool isnan( float arg );
 
bool isnan( float arg );
 
}}
 
}}
{{dcl | since=c++11 |
+
{{dcl | since=c++11 | num=2 |
 
bool isnan( double arg );
 
bool isnan( double arg );
 
}}
 
}}
{{dcl | since=c++11 |
+
{{dcl | since=c++11 | num=3 |
 
bool isnan( long double arg );
 
bool isnan( long double arg );
 +
}}
 +
{{dcl | since=c++11 | num=4 |
 +
bool isnan( Integral arg );
 
}}
 
}}
 
{{dcl end}}
 
{{dcl end}}
  
Determines if the given floating point number {{tt|arg}} is not-a-number ({{tt|NaN}}).
+
@1-3@ Determines if the given floating point number {{tt|arg}} is a not-a-number (NaN) value.
 +
@4@ A set of overloads or a function template accepting the {{tt|from}} argument of any [[cpp/types/is_integral|integral type]]. Equivalent to {{v|2}} (the argument is cast to {{c|double}}).  
  
 
===Parameters===
 
===Parameters===
Line 23: Line 27:
 
===Return value===
 
===Return value===
  
{{c|true}} if {{tt|arg}} is {{c|NaN}}, {{c|false}} otherwise
+
{{c|true}} if {{tt|arg}} is a NaN, {{c|false}} otherwise
  
 
===Notes===
 
===Notes===
In C, {{c|isnan}} is a preprocessor macro, rather than a function.
+
There are many different NaN values with different sign bits and payloads, see {{lc|std::nan}} and {{lc|std::numeric_limits::quiet_NaN}}.
 +
 
 +
NaN values never compare equal to themselves or to other NaN values. Copying a NaN may change its bit pattern.
 +
 
 +
Another way to test if a floating-point value is NaN is to compare it with itself: {{c|bool is_nan(double x) { return x != x; }}}
 +
 
 +
===Example===
 +
{{example
 +
|code=
 +
#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';
 +
}
 +
|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
 +
}}
  
 
===See also===
 
===See also===
  
 
{{dsc begin}}
 
{{dsc begin}}
 +
{{dsc inc | cpp/numeric/math/dsc nan}}
 
{{dsc inc | cpp/numeric/math/dsc fpclassify}}
 
{{dsc inc | cpp/numeric/math/dsc fpclassify}}
 
{{dsc inc | cpp/numeric/math/dsc isfinite}}
 
{{dsc inc | cpp/numeric/math/dsc isfinite}}

Revision as of 06:29, 10 October 2014

 
 
 
 
Defined in header <cmath>
bool isnan( float arg );
(1) (since C++11)
bool isnan( double arg );
(2) (since C++11)
bool isnan( long double arg );
(3) (since C++11)
bool isnan( Integral arg );
(4) (since C++11)
1-3) Determines if the given floating point number arg is a not-a-number (NaN) value.
4) A set of overloads or a function template accepting the from argument of any integral type. Equivalent to (2) (the argument is cast to double).

Contents

Parameters

arg - floating point value

Return value

true if arg is a NaN, false otherwise

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 may change its bit pattern.

Another way to test if a floating-point value is NaN is to compare it with itself: {{{1}}}}

Example

#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';
}

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

See also

Template:cpp/numeric/math/dsc nan
categorizes the given floating-point value
(function) [edit]
(C++11)
checks if the given number has finite value
(function) [edit]
(C++11)
checks if the given number is infinite
(function) [edit]
(C++11)
checks if the given number is normal
(function) [edit]
checks if two floating-point values are unordered
(function) [edit]
C documentation for isnan