std::numeric_limits<T>:: max_digits10
|
static
constexpr
int
max_digits10
|
(desde C++11) | |
El valor de
std::
numeric_limits
<
T
>
::
max_digits10
es el número de dígitos en base 10 que son necesarios para representar de forma única todos los valores distintos del tipo
T
, como se requiere para serialización/deserialización a texto. Esta constante es significativa para todos los tipos de punto flotante.
Contenidos |
Especializaciones estándar
T
|
Valor de std:: numeric_limits < T > :: max_digits10 |
| /* no especializado */ | 0 |
| bool | 0 |
| char | 0 |
| signed char | 0 |
| unsigned char | 0 |
| wchar_t | 0 |
| char8_t (desde C++20) | 0 |
| char16_t | 0 |
| char32_t | 0 |
| short | 0 |
| unsigned short | 0 |
| int | 0 |
| unsigned int | 0 |
| long | 0 |
| unsigned long | 0 |
| long long | 0 |
| unsigned long long | 0 |
| float | FLT_DECIMAL_DIG o std:: ceil ( std:: numeric_limits < float > :: digits * std:: log10 ( 2 ) + 1 ) |
| double | DBL_DECIMAL_DIG o std:: ceil ( std:: numeric_limits < double > :: digits * std:: log10 ( 2 ) + 1 ) |
| long double | DECIMAL_DIG o LDBL_DECIMAL_DIG o std:: ceil ( std:: numeric_limits < long double > :: digits * std:: log10 ( 2 ) + 1 ) |
Notas
A diferencia de la mayoría de las operaciones matemáticas, la conversión de un valor de punto flotante a texto y de vuelta es
exacta
siempre que se utilicen al menos
max_digits10
(
9
para
float
,
17
para
double
): se garantiza que producirá el mismo valor de punto flotante, aunque la representación intermedia en texto no sea exacta. Puede requerir más de cien dígitos decimales para representar el valor preciso de un
float
en notación decimal.
Ejemplo
#include <cmath> #include <iomanip> #include <iostream> #include <limits> #include <sstream> int main() { float value = 10.0000086; constexpr auto digits10 = std::numeric_limits<decltype(value)>::digits10; constexpr auto max_digits10 = std::numeric_limits<decltype(value)>::max_digits10; constexpr auto submax_digits10 = max_digits10 - 1; std::cout << "float:\n" " digits10 is " << digits10 << " digits\n" " max_digits10 is " << max_digits10 << " digits\n" "submax_digits10 is " << submax_digits10 << " digits\n\n"; const auto original_precision = std::cout.precision(); for (auto i = 0; i < 5; ++i) { std::cout << " max_digits10: " << std::setprecision(max_digits10) << value << "\n" "submax_digits10: " << std::setprecision(submax_digits10) << value << "\n\n"; value = std::nextafter(value, std::numeric_limits<decltype(value)>::max()); } std::cout.precision(original_precision); }
Salida:
float:
digits10 is 6 digits
max_digits10 is 9 digits
submax_digits10 is 8 digits
max_digits10: 10.0000086
submax_digits10: 10.000009
max_digits10: 10.0000095
submax_digits10: 10.00001
max_digits10: 10.0000105
submax_digits10: 10.00001
max_digits10: 10.0000114
submax_digits10: 10.000011
max_digits10: 10.0000124
submax_digits10: 10.000012
Véase también
|
[static]
|
la base o raíz entera utilizada por la representación del tipo dado
(constante de miembro estática pública) |
|
[static]
|
número de dígitos en
radix
que pueden representarse sin cambio
(constante de miembro estática pública) |
|
[static]
|
número de dígitos decimales que pueden representarse sin cambio
(constante de miembro estática pública) |
|
[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 estática pública) |
|
[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 estática pública) |