Namensräume
Varianten
Aktionen

std::numeric_limits<T>::signaling_NaN

Von cppreference.com
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
 
 
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

identifiziert Gleitkommatypen, die den speziellen Wert "signaling not-a-number" (NaN) darstellen können
(öffentliche statische Member-Konstante) [bearbeiten]
[static]
gibt einen stillen NaN-Wert des gegebenen Gleitkommatyps zurück
(öffentliche statische Member-Funktion) [bearbeiten]
(C++11)
prüft, ob die gegebene Zahl NaN ist
(Funktion) [bearbeiten]