Namespaces
Variants

std::numeric_limits<T>:: max_digits10

From cppreference.net
Utilities library
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)
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)
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)