std::numeric_limits<T>::signaling_NaN
static T signaling_NaN() throw(); |
(bis C++11) | |
| static constexpr T signaling_NaN() noexcept; |
(seit C++11) | |
Gibt den speziellen Wert "signaling not-a-number" zurück, wie er vom Gleitkommatyp T dargestellt wird. Nur sinnvoll, wenn std::numeric_limits<T>::has_signaling_NaN == true. In IEEE 754, der gebräuchlichsten binären Darstellung von Gleitkommazahlen, repräsentiert jeder Wert mit gesetzten Exponenten-Bits und mindestens einem gesetzten Bruchteil-Bit eine NaN. Es ist implementierungsabhängig, welche Werte des Bruchteils Quiet oder Signaling NaNs repräsentieren und ob das Vorzeichen-Bit aussagekräftig ist.
Inhalt |
[bearbeiten] Rückgabewert
T
|
std::numeric_limits<T>::signaling_NaN() |
| /* nicht spezialisiert */ | T() |
| bool | false |
| char | 0 |
| signed char | 0 |
| unsigned char | 0 |
| wchar_t | 0 |
| char8_t (seit C++20) | 0 |
| char16_t (seit C++11) | 0 |
| char32_t (seit C++11) | 0 |
| short | 0 |
| unsigned short | 0 |
| int | 0 |
| unsigned int | 0 |
| long | 0 |
| unsigned long | 0 |
| long long (seit C++11) | 0 |
| unsigned long long (seit C++11) | 0 |
| float | implementierungsabhängig (kann FLT_SNAN sein) |
| double | implementierungsabhängig (kann DBL_SNAN sein) |
| long double | implementierungsabhängig (kann LDBL_SNAN sein) |
[bearbeiten] Hinweise
Eine NaN vergleicht sich niemals mit sich selbst. Das Kopieren einer NaN ist gemäß IEEE-754 nicht erforderlich, um ihre Bitdarstellung (Vorzeichen und Payload) beizubehalten, obwohl die meisten Implementierungen dies tun.
Wenn eine Signaling NaN als Argument für einen arithmetischen Ausdruck verwendet wird, kann die entsprechende Gleitkomma-Exception ausgelöst werden und die NaN wird "quietiert", d. h. der Ausdruck gibt eine Quiet NaN zurück.
[bearbeiten] Beispiel
Demonstriert die Verwendung einer Signaling NaN zum Auslösen einer Gleitkomma-Exception
#include <cfenv> #include <iostream> #include <limits> #pragma STDC_FENV_ACCESS on void show_fe_exceptions() { int n = std::fetestexcept(FE_ALL_EXCEPT); if (n & FE_INVALID) std::cout << "FE_INVALID is raised\n"; else if (n == 0) std::cout << "no exceptions are raised\n"; std::feclearexcept(FE_ALL_EXCEPT); } int main() { double snan = std::numeric_limits<double>::signaling_NaN(); std::cout << "After sNaN was obtained, "; show_fe_exceptions(); double qnan = snan * 2.0; std::cout << "After sNaN was multiplied by 2, "; show_fe_exceptions(); double qnan2 = qnan * 2.0; std::cout << "After the quieted NaN was multiplied by 2, "; show_fe_exceptions(); std::cout << "The result is " << qnan2 << '\n'; }
Ausgabe
After sNaN was obtained, no exceptions are raised After sNaN was multiplied by 2, FE_INVALID is raised After the quieted NaN was multiplied by 2, no exceptions are raised The result is nan
[bearbeiten] Siehe auch
| [static] |
identifiziert Gleitkommatypen, die den speziellen Wert "signaling not-a-number" (NaN) darstellen können (öffentliche statische Member-Konstante) |
| [static] |
gibt einen stillen NaN-Wert des gegebenen Gleitkommatyps zurück (öffentliche statische Member-Funktion) |
| (C++11) |
prüft, ob die gegebene Zahl NaN ist (Funktion) |