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 durch den 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, stellt jeder Wert, bei dem alle Bits des Exponenten gesetzt sind und mindestens ein Bit der Mantisse gesetzt ist, ein NaN dar. Es ist implementierungsdefiniert, welche Werte der Mantisse für Quiet- oder Signaling-NaNs stehen, und ob das Vorzeichenbit bedeutsam ist.
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 | implementierungsdefiniert (kann FLT_SNAN sein) |
| double | implementierungsdefiniert (kann DBL_SNAN sein) |
| long double | implementierungsdefiniert (kann LDBL_SNAN sein) |
Hinweise
Ein NaN (Not a Number) vergleicht sich niemals als gleich mit sich selbst. Das Kopieren eines NaN muss laut IEEE-754 nicht seine Bitdarstellung (Vorzeichen und Payload ) erhalten, obwohl die meisten Implementierungen dies tun.
Wenn ein signalisierender NaN als Argument für einen arithmetischen Ausdruck verwendet wird, kann die entsprechende Gleitkomma-Ausnahme ausgelöst werden und der NaN wird "beruhigt", das heißt, der Ausdruck gibt einen stillen NaN zurück.
Beispiel
Demonstriert die Verwendung einer signalisierenden NaN, um eine Gleitkomma-Ausnahme auszulösen:
#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
Siehe auch
|
[static]
|
identifiziert Gleitkommatypen, die den speziellen Wert "signaling not-a-number" (NaN) darstellen können
(öffentliche statische Member-Konstante) |
|
[static]
|
gibt einen quiet NaN-Wert des gegebenen Gleitkommatyps zurück
(öffentliche statische Member-Funktion) |
|
(C++11)
|
prüft, ob die gegebene Zahl NaN ist
(Funktion) |