Namespaces
Variants

std:: numeric_limits

From cppreference.net
Utilities library
Definido en el encabezado <limits>
template < class T > class numeric_limits ;

La plantilla de clase std::numeric_limits proporciona una forma estandarizada de consultar varias propiedades de los tipos aritméticos (por ejemplo, el valor más grande posible para el tipo int es std :: numeric_limits < int > :: max ( ) ).

Esta información se proporciona mediante especializaciones de la plantilla std::numeric_limits . La biblioteca estándar pone a disposición especializaciones para todos los tipos aritméticos (solo enumera las especializaciones para tipos aritméticos sin calificadores cv):

Definido en el encabezado <limits>
template <> class numeric_limits < bool > ;
template <> class numeric_limits < char > ;
template <> class numeric_limits < signed char > ;
template <> class numeric_limits < unsigned char > ;
template <> class numeric_limits < wchar_t > ;
template <> class numeric_limits < char8_t > ;
(desde C++20)
template <> class numeric_limits < char16_t > ;
(desde C++11)
template <> class numeric_limits < char32_t > ;
(desde C++11)
template <> class numeric_limits < short > ;
template <> class numeric_limits < unsigned short > ;
template <> class numeric_limits < int > ;
template <> class numeric_limits < unsigned int > ;
template <> class numeric_limits < long > ;
template <> class numeric_limits < unsigned long > ;
template <> class numeric_limits < long long > ;
(desde C++11)
template <> class numeric_limits < unsigned long long > ;
(desde C++11)
template <> class numeric_limits < float > ;
template <> class numeric_limits < double > ;
template <> class numeric_limits < long double > ;

El valor de cada miembro de una especialización de std::numeric_limits en un tipo calificado cv cv T es igual al valor del miembro correspondiente de la especialización en el tipo no calificado T . Por ejemplo, std :: numeric_limits < int > :: digits es igual a std :: numeric_limits < const int > :: digits .

Los alias de tipos aritméticos (como std::size_t o std::streamsize ) también pueden examinarse con los rasgos de tipo std::numeric_limits .

Los tipos estándar no aritméticos, como std:: complex < T > o std::nullptr_t , no tienen especializaciones.

Si la implementación define algún tipo de clase entera , también deben proporcionarse especializaciones de std::numeric_limits para ellos.

(desde C++20)

Las implementaciones pueden proporcionar especializaciones de std::numeric_limits para tipos específicos de la implementación: por ejemplo, GCC proporciona std::numeric_limits<__int128> . Las bibliotecas no estándar pueden agregar especializaciones para tipos proporcionados por la biblioteca, por ejemplo, OpenEXR proporciona std::numeric_limits<half> para un tipo de coma flotante de 16 bits.

Contenidos

Parámetros de plantilla

T - un tipo para recuperar propiedades numéricas

Constantes de miembro

identifica tipos para los cuales std::numeric_limits está especializado
(constante de miembro público estático)
[static]
identifica tipos con signo
(constante de miembro público estático)
[static]
identifica tipos enteros
(constante de miembro público estático)
[static]
identifica tipos exactos
(constante de miembro público estático)
identifica los tipos de punto flotante que pueden representar el valor especial "infinito positivo"
(constante de miembro pública estática)
identifica los tipos de punto flotante que pueden representar el valor especial "not-a-number silencioso" (NaN)
(constante de miembro pública estática)
identifica los tipos de punto flotante que pueden representar el valor especial "not-a-number señalizador" (NaN)
(constante de miembro público estático)
[static]
identifica el estilo de desnormalización utilizado por el tipo de punto flotante
(constante de miembro pública estática)
identifica los tipos de punto flotante que detectan pérdida de precisión como pérdida por desnormalización en lugar de resultado inexacto
(constante de miembro público estático)
[static]
identifica el estilo de redondeo utilizado por el tipo
(constante de miembro público estático)
[static]
identifica los tipos de punto flotante IEC 559/IEEE 754
(constante de miembro público estático)
[static]
identifica tipos que representan un conjunto finito de valores
(constante de miembro público estático)
[static]
identifica tipos que manejan desbordamientos con aritmética modular
(constante de miembro público estático)
[static]
número de radix dígitos que pueden representarse sin cambio
(constante de miembro público estático)
[static]
número de dígitos decimales que pueden representarse sin cambio
(constante de miembro público estático)
[static] (C++11)
número de dígitos decimales necesarios para diferenciar todos los valores de este tipo
(constante de miembro público estático)
[static]
la base o raíz entera utilizada por la representación del tipo dado
(constante de miembro público estático)
uno más que la potencia negativa más pequeña de la base que es un valor válido normalizado de punto flotante
(constante de miembro público estático)
la potencia negativa más pequeña de diez que es un valor válido normalizado de punto flotante
(constante de miembro pública estática)
uno más que la mayor potencia entera de la base que es un valor finito válido de punto flotante
(constante de miembro pública estática)
la mayor potencia entera de 10 que es un valor finito válido de punto flotante
(constante de miembro pública estática)
[static]
identifica tipos que pueden causar que las operaciones aritméticas generen traps
(constante de miembro público estático)
identifica los tipos de punto flotante que detectan tinyness antes del redondeo
(constante de miembro estático público)

Funciones miembro

[static]
devuelve el valor finito más pequeño del tipo no flotante dado, o el valor normal positivo más pequeño del tipo flotante dado
(función miembro pública estática)
[static] (C++11)
devuelve el valor finito más bajo del tipo dado, es decir, el valor más negativo para tipos con signo, 0 para tipos sin signo
(función miembro pública estática)
[static]
devuelve el valor finito más grande del tipo dado
(función miembro pública estática)
[static]
devuelve la diferencia entre 1.0 y el siguiente valor representable del tipo flotante dado
(función miembro pública estática)
[static]
devuelve el error de redondeo máximo del tipo flotante dado
(función miembro pública estática)
[static]
devuelve el valor de infinito positivo del tipo flotante dado
(función miembro pública estática)
[static]
devuelve un valor NaN silencioso del tipo flotante dado
(función miembro pública estática)
devuelve un valor NaN de señalización del tipo flotante dado
(función miembro pública estática)
[static]
devuelve el valor subnormal positivo más pequeño del tipo flotante dado
(función miembro pública estática)

Clases auxiliares

indica los modos de redondeo de punto flotante
(enum)
indica los modos de desnormalización de punto flotante
(enum)

Relación con las constantes macro de la biblioteca C

Especialización
std::numeric_limits<T>
donde T es
Miembros
min() lowest()
(C++11)
max() radix
bool false false true 2
char CHAR_MIN CHAR_MIN CHAR_MAX 2
signed char SCHAR_MIN SCHAR_MIN SCHAR_MAX 2
unsigned char 0 0 UCHAR_MAX 2
wchar_t WCHAR_MIN WCHAR_MIN WCHAR_MAX 2
char8_t 0 0 UCHAR_MAX 2
char16_t 0 0 UINT_LEAST16_MAX 2
char32_t 0 0 UINT_LEAST32_MAX 2
short SHRT_MIN SHRT_MIN SHRT_MAX 2
signed short
unsigned short 0 0 USHRT_MAX 2
int INT_MIN INT_MIN INT_MAX 2
signed int
unsigned int 0 0 UINT_MAX 2
long LONG_MIN LONG_MIN LONG_MAX 2
signed long
unsigned long 0 0 ULONG_MAX 2
long long LLONG_MIN LLONG_MIN LLONG_MAX 2
signed long long
unsigned long long 0 0 ULLONG_MAX 2
Especialización
std::numeric_limits<T>
donde T es
Miembros
denorm_min() min() lowest()
(C++11)
max() epsilon() digits digits10
float FLT_TRUE_MIN FLT_MIN - FLT_MAX FLT_MAX FLT_EPSILON FLT_MANT_DIG FLT_DIG
double DBL_TRUE_MIN DBL_MIN - DBL_MAX DBL_MAX DBL_EPSILON DBL_MANT_DIG DBL_DIG
long double LDBL_TRUE_MIN LDBL_MIN - LDBL_MAX LDBL_MAX LDBL_EPSILON LDBL_MANT_DIG LDBL_DIG
Especialización
std::numeric_limits<T>
donde T es
Miembros (continuación)
min_exponent min_exponent10 max_exponent max_exponent10 radix
float FLT_MIN_EXP FLT_MIN_10_EXP FLT_MAX_EXP FLT_MAX_10_EXP FLT_RADIX
double DBL_MIN_EXP DBL_MIN_10_EXP DBL_MAX_EXP DBL_MAX_10_EXP FLT_RADIX
long double LDBL_MIN_EXP LDBL_MIN_10_EXP LDBL_MAX_EXP LDBL_MAX_10_EXP FLT_RADIX

Ejemplo

#include <iostream>
#include <limits>
int main() 
{
    std::cout << "type\t│ lowest()\t│ min()\t\t│ max()\n"
              << "bool\t│ "
              << std::numeric_limits<bool>::lowest() << "\t\t│ "
              << std::numeric_limits<bool>::min() << "\t\t│ "
              << std::numeric_limits<bool>::max() << '\n'
              << "uchar\t│ "
              << +std::numeric_limits<unsigned char>::lowest() << "\t\t│ "
              << +std::numeric_limits<unsigned char>::min() << "\t\t│ "
              << +std::numeric_limits<unsigned char>::max() << '\n'
              << "int\t│ "
              << std::numeric_limits<int>::lowest() << "\t│ "
              << std::numeric_limits<int>::min() << "\t│ "
              << std::numeric_limits<int>::max() << '\n'
              << "float\t│ "
              << std::numeric_limits<float>::lowest() << "\t│ "
              << std::numeric_limits<float>::min() << "\t│ "
              << std::numeric_limits<float>::max() << '\n'
              << "double\t│ "
              << std::numeric_limits<double>::lowest() << "\t│ "
              << std::numeric_limits<double>::min() << "\t│ "
              << std::numeric_limits<double>::max() << '\n';
}

Salida posible:

type	│ lowest()	│ min()		│ max()
bool	│ 0		│ 0		│ 1
uchar	│ 0		│ 0		│ 255
int	│ -2147483648	│ -2147483648	│ 2147483647
float	│ -3.40282e+38	│ 1.17549e-38	│ 3.40282e+38
double	│ -1.79769e+308	│ 2.22507e-308	│ 1.79769e+308

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 201 C++98 se necesitaban proporcionar especializaciones para todos los tipos fundamentales se excluyeron los tipos no aritméticos
LWG 559 C++98 no estaba claro si la especialización std::numeric_limits
para un tipo calificado con cv se comporta igual que
la especialización correspondiente para el tipo sin calificación cv
tienen el
mismo comportamiento

Véase también