std::numeric_limits<T>:: digits10
|
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) |
|
[static]
|
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) |
|
[static]
|
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) |