Namensräume
Varianten
Aktionen

std::isnan

Von cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
 
Definiert in der Header-Datei <cmath>
(1)
bool isnan( float num );

bool isnan( double num );

bool isnan( long double num );
(seit C++11)
(bis C++23)
constexpr bool isnan( /*floating-point-type*/ num );
(seit C++23)
SIMD-Überladung (seit C++26)
Definiert im Header <simd>
template< /*math-floating-point*/ V >

constexpr typename /*deduced-simd-t*/<V>::mask_type

  isnan ( const V& v_num );
(S) (seit C++26)
Definiert in der Header-Datei <cmath>
template< class Integer >
bool isnan( Integer num );
(A) (seit C++11)
(constexpr seit C++23)
1) Bestimmt, ob die gegebene Gleitkommazahl num ein Not-a-Number (NaN) Wert ist. Die Bibliothek stellt Überladungen für alle cv-unqualifizierten Gleitkommatypen als Parametertyp von num bereit.(seit C++23)
S) Die SIMD-Überladung führt eine elementweise std::isnan auf v_num durch.
(Siehe math-floating-point und deduced-simd-t für ihre Definitionen.)
(seit C++26)
A) Zusätzliche Überladungen werden für alle ganzzahligen Typen bereitgestellt, die als double behandelt werden.

Inhalt

[bearbeiten] Parameter

num - Gleitkomma- oder Ganzzahlwert
v_num - Ein datenparalleles Objekt einer std::basic_simd-Spezialisierung, deren Elementtyp ein Gleitkommatyp ist

[bearbeiten] Rückgabewert

1) true, wenn num ein NaN ist, andernfalls false.
S) Ein datenparalleles Maskierungsobjekt, bei dem das i-te Element gleich true ist, wenn v_num[i] ein NaN ist, oder false andernfalls für alle i im Bereich [0v_num.size()).

[bearbeiten] Anmerkungen

Es gibt viele verschiedene NaN-Werte mit unterschiedlichen Vorzeichenbits und Payloads, siehe std::nan und std::numeric_limits::quiet_NaN.

NaN-Werte sind niemals gleich zu sich selbst oder zu anderen NaN-Werten. Das Kopieren eines NaN muss gemäß IEEE-754 nicht dessen Bitdarstellung (Vorzeichen und Payload) beibehalten, obwohl die meisten Implementierungen dies tun.

Eine andere Möglichkeit, um zu testen, ob ein Gleitkommawert NaN ist, ist der Vergleich mit sich selbst: bool is_nan(double x) { return x != x; }.

GCC und Clang unterstützen die Option -ffinite-math (zusätzlich impliziert durch -ffast-math), die es dem jeweiligen Compiler erlaubt, die Nichtexistenz spezieller IEEE-754 Gleitkommawerte wie NaN, Unendlichkeit oder negative Null anzunehmen. Mit anderen Worten, std::isnan gibt unter dieser Option immer false zurück.

Die zusätzlichen Überladungen müssen nicht exakt als (A) bereitgestellt werden. Sie müssen lediglich ausreichen, um sicherzustellen, dass für ihr Argument num vom Ganzzahltyp std::isnan(num) denselben Effekt hat wie std::isnan(static_cast<double>(num)).

[edit] Beispiel

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

Ausgabe

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] Siehe auch

(C++11)(C++11)(C++11)
Not-a-Number (NaN)
(Funktion) [bearbeiten]
klassifiziert den gegebenen Gleitkommawert
(Funktion) [bearbeiten]
(C++11)
prüft, ob die gegebene Zahl endlich ist
(Funktion) [bearbeiten]
(C++11)
prüft, ob die gegebene Zahl unendlich ist
(Funktion) [bearbeiten]
(C++11)
prüft, ob die gegebene Zahl normal ist
(Funktion) [bearbeiten]
prüft, ob zwei Gleitkommawerte ungeordnet sind
(Funktion) [bearbeiten]
C-Dokumentation für isnan