std:: numeric_limits
|
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
|
(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
|
[static]
|
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) |
|
[static]
|
identifica los tipos de punto flotante que pueden representar el valor especial "infinito positivo"
(constante de miembro pública estática) |
|
[static]
|
identifica los tipos de punto flotante que pueden representar el valor especial "not-a-number silencioso" (NaN)
(constante de miembro pública estática) |
|
[static]
|
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) |
|
[static]
|
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) |
|
[static]
|
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) |
|
[static]
|
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) |
|
[static]
|
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) |
|
[static]
|
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) |
|
[static]
|
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) |
|
[static]
|
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 |