Namespaces
Variants

std::numeric_limits<T>:: signaling_NaN

From cppreference.net
Utilities library
static T signaling_NaN ( ) throw ( ) ;
(hasta C++11)
static constexpr T signaling_NaN ( ) noexcept ;
(desde C++11)

Retorna el valor especial "signaling not-a-number ", representado por el tipo de punto flotante T . Solo tiene sentido si std:: numeric_limits < T > :: has_signaling_NaN == true . En IEEE 754, la representación binaria más común de números de punto flotante, cualquier valor con todos los bits del exponente establecidos y al menos un bit de la fracción establecido representa un NaN. Está definido por la implementación qué valores de la fracción representan NaNs silenciosos o de señalización, y si el bit de signo es significativo.

Contenidos

Valor de retorno

T std:: numeric_limits < T > :: signaling_NaN ( )
/* no especializado */ T ( )
bool false
char 0
signed char 0
unsigned char 0
wchar_t 0
char8_t (desde C++20) 0
char16_t (desde C++11) 0
char32_t (desde C++11) 0
short 0
unsigned short 0
int 0
unsigned int 0
long 0
unsigned long 0
long long (desde C++11) 0
unsigned long long (desde C++11) 0
float definido por la implementación (puede ser FLT_SNAN )
double definido por la implementación (puede ser DBL_SNAN )
long double definido por la implementación (puede ser LDBL_SNAN )

Notas

Un NaN nunca se compara igual a sí mismo. Copiar un NaN no está obligado, por IEEE-754, a preservar su representación de bits (signo y payload ), aunque la mayoría de las implementaciones lo hacen.

Cuando se utiliza un NaN señalizador como argumento en una expresión aritmética, puede generarse la excepción de punto flotante apropiada y el NaN se "silencia", es decir, la expresión devuelve un NaN silencioso.

Ejemplo

Demuestra el uso de un NaN señalizador para generar una excepción de punto flotante:

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

Salida:

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

Véase también

identifica los tipos de punto flotante que pueden representar el valor especial "NaN señalizador" (not-a-number)
(constante de miembro público estático)
[static]
devuelve un valor NaN silencioso del tipo de punto flotante dado
(función de miembro público estático)
(C++11)
comprueba si el número dado es NaN
(función)