Namespaces
Variants

std::numeric_limits<T>:: signaling_NaN

From cppreference.net
Utilities library
static T signaling_NaN ( ) throw ( ) ;
(jusqu'à C++11)
static constexpr T signaling_NaN ( ) noexcept ;
(depuis C++11)

Retourne la valeur spéciale « NaN signalé » (Not-a-Number) , telle que représentée par le type à virgule flottante T . N'a de sens que si std:: numeric_limits < T > :: has_signaling_NaN == true . Dans la norme IEEE 754, la représentation binaire la plus courante des nombres à virgule flottante, toute valeur dont tous les bits de l'exposant sont définis et au moins un bit de la mantisse est défini représente un NaN. Il est défini par l'implémentation quelles valeurs de la mantisse représentent des NaNs silencieux ou signalés, et si le bit de signe est significatif.

Table des matières

Valeur de retour

T std:: numeric_limits < T > :: signaling_NaN ( )
/* non-spécialisé */ T ( )
bool false
char 0
signed char 0
unsigned char 0
wchar_t 0
char8_t (depuis C++20) 0
char16_t (depuis C++11) 0
char32_t (depuis C++11) 0
short 0
unsigned short 0
int 0
unsigned int 0
long 0
unsigned long 0
long long (depuis C++11) 0
unsigned long long (depuis C++11) 0
float défini par l'implémentation (peut être FLT_SNAN )
double défini par l'implémentation (peut être DBL_SNAN )
long double défini par l'implémentation (peut être LDBL_SNAN )

Notes

Un NaN ne se compare jamais égal à lui-même. La copie d'un NaN n'est pas requise, par IEEE-754, pour préserver sa représentation binaire (signe et payload ), bien que la plupart des implémentations le fassent.

Lorsqu'un NaN signalé est utilisé comme argument dans une expression arithmétique, l'exception en virgule flottante appropriée peut être levée et le NaN est "rendu silencieux", c'est-à-dire que l'expression retourne un NaN silencieux.

Exemple

Illustre l'utilisation d'un NaN signalétique pour déclencher une exception en virgule flottante :

#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';
}

Sortie :

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

Voir aussi

identifie les types à virgule flottante qui peuvent représenter la valeur spéciale "not-a-number signalant" (NaN)
(constante de membre statique publique)
[static]
renvoie une valeur NaN silencieuse du type à virgule flottante donné
(fonction de membre statique publique)
(C++11)
vérifie si le nombre donné est NaN
(fonction)