Namespaces
Variants

std::numeric_limits<T>:: digits10

From cppreference.net
Utilities library
static const int digits10 ;
(hasta C++11)
static constexpr int digits10 ;
(desde C++11)

El valor de std:: numeric_limits < T > :: digits10 es el número de dígitos en base 10 que pueden ser representados por el tipo T sin cambio, es decir, cualquier número con esta cantidad de dígitos decimales significativos puede convertirse a un valor de tipo T y de vuelta a forma decimal, sin alteración debido a redondeo o desbordamiento. Para tipos de base radix , es el valor de digits() ( digits - 1 para tipos de punto flotante) multiplicado por log 10 (radix) y redondeado hacia abajo.

Especializaciones estándar

T valor de std:: numeric_limits < T > :: digits10
/* no especializado */ 0
bool 0
char std:: numeric_limits < char > :: digits * std:: log10 ( 2 )
signed char std:: numeric_limits < signed char > :: digits * std:: log10 ( 2 )
unsigned char std:: numeric_limits < unsigned char > :: digits * std:: log10 ( 2 )
wchar_t std:: numeric_limits < wchar_t > :: digits * std:: log10 ( 2 )
char8_t (desde C++20) std:: numeric_limits < char8_t > :: digits * std:: log10 ( 2 )
char16_t (desde C++11) std:: numeric_limits < char16_t > :: digits * std:: log10 ( 2 )
char32_t (desde C++11) std:: numeric_limits < char32_t > :: digits * std:: log10 ( 2 )
short std:: numeric_limits < short > :: digits * std:: log10 ( 2 )
unsigned short std:: numeric_limits < unsigned short > :: digits * std:: log10 ( 2 )
int std:: numeric_limits < int > :: digits * std:: log10 ( 2 )
unsigned int std:: numeric_limits < unsigned int > :: digits * std:: log10 ( 2 )
long std:: numeric_limits < long > :: digits * std:: log10 ( 2 )
unsigned long std:: numeric_limits < unsigned long > :: digits * std:: log10 ( 2 )
long long (desde C++11) std:: numeric_limits < long long > :: digits * std:: log10 ( 2 )
unsigned long long (desde C++11) std:: numeric_limits < unsigned long long > :: digits * std:: log10 ( 2 )
float FLT_DIG ( 6 para IEEE float )
double DBL_DIG ( 15 para IEEE double )
long double LDBL_DIG ( 18 para long double de 80 bits Intel; 33 para cuádruple IEEE)

Ejemplo

Un tipo binario de 8 bits puede representar exactamente cualquier número decimal de dos dígitos, pero los números decimales de 3 dígitos 256..999 no pueden representarse. El valor de digits10 para un tipo de 8 bits es 2 ( 8 * std:: log10 ( 2 ) es 2.41)

El tipo de punto flotante estándar IEEE 754 de 32 bits tiene una parte fraccionaria de 24 bits (23 bits escritos, uno implícito), lo que puede sugerir que puede representar números decimales de 7 dígitos ( 24 * std:: log10 ( 2 ) es 7.22), pero los errores de redondeo relativo no son uniformes y algunos valores de punto flotante con 7 dígitos decimales no sobreviven la conversión a float de 32 bits y viceversa: el ejemplo positivo más pequeño es 8.589973e9 , que se convierte en 8.589974e9 después del viaje de ida y vuelta. Estos errores de redondeo no pueden exceder un bit en la representación, y digits10 se calcula como ( 24 - 1 ) * std:: log10 ( 2 ) , que es 6.92. Redondear hacia abajo resulta en el valor 6.

Del mismo modo, la cadena de 16 dígitos 9007199254740993 no sobrevive al ciclo texto->double->texto, convirtiéndose en 9007199254740992 : el tipo double de 64 bits IEEE 754 garantiza este ciclo solo para 15 dígitos decimales.

Véase también

[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 entera o raíz utilizada por la representación del tipo dado
(constante de miembro público estático)
[static]
número de dígitos en base radix que pueden representarse sin cambio
(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 de punto flotante normalizado válido
(constante de miembro público estático)
uno más que la mayor potencia entera de la base que es un valor finito de punto flotante válido
(constante de miembro público estático)