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 aussagekräftig, wenn
std::
numeric_limits
<
T
>
::
has_signaling_NaN
==
true
. In IEEE 754, der häufigsten binären Darstellung von Gleitkommazahlen, repräsentiert jeder Wert, bei dem alle Bits des Exponenten gesetzt sind und mindestens ein Bit des Mantisse gesetzt ist, einen NaN. Es ist implementierungsdefiniert, welche Werte der Mantisse stille oder signalisierende NaNs darstellen und ob das Vorzeichenbit bedeutungsvoll ist.
Inhaltsverzeichnis |
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) |