std::isnan
| Definiert in der Header-Datei <cmath> |
||
| (1) | ||
bool isnan( float num ); bool isnan( 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 |
(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) |
|
S) Die SIMD-Überladung führt eine elementweise
std::isnan auf v_num durch.
|
(seit C++26) |
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
[0, v_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) |
| (C++11) |
klassifiziert den gegebenen Gleitkommawert (Funktion) |
| (C++11) |
prüft, ob die gegebene Zahl endlich ist (Funktion) |
| (C++11) |
prüft, ob die gegebene Zahl unendlich ist (Funktion) |
| (C++11) |
prüft, ob die gegebene Zahl normal ist (Funktion) |
| (C++11) |
prüft, ob zwei Gleitkommawerte ungeordnet sind (Funktion) |
| C-Dokumentation für isnan
| |