Namespaces
Variants

std::numeric_limits<T>::signaling_NaN

De es.cppreference.net
 
 
Biblioteca de utilidades
Soporte del lenguaje
Soporte de tipos (tipos básicos, RTTI)
Macros de prueba de características de la biblioteca (C++20)
Utilidades de programa
Funciones variádicas
Soporte de corrutinas (C++20)
Soporte de contratos (C++26)
Comparación a tres vías
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

 
Soporte de tipos
Tipos básicos
Tipos enteros de ancho fijo (C++11)
Tipos de punto flotante de ancho fijo (C++23)
(C++11)    
(C++17)
Límites numéricos
Interfaz de límites numéricos de C
Información de tipo en tiempo de ejecución
 
 
static T signaling_NaN() throw();
(hasta C++11)
static constexpr T signaling_NaN() noexcept;
(desde C++11)

Devuelve el valor especial "señalización no es un número", según lo 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. Depende de la implementación qué valores de la fracción representan NaN silenciosos o de señalización, y si el bit de signo es significativo.

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)