Namespaces
Variants

std::numeric_limits<T>:: max_digits10

From cppreference.net
Utilities library
static constexpr int max_digits10
(depuis C++11)

La valeur de std:: numeric_limits < T > :: max_digits10 est le nombre de chiffres en base 10 nécessaires pour représenter de manière unique toutes les valeurs distinctes du type T , comme requis pour la sérialisation/désérialisation en texte. Cette constante est significative pour tous les types à virgule flottante.

Table des matières

Spécialisations standards

T Valeur de std:: numeric_limits < T > :: max_digits10
/* non-spécialisé */ 0
bool 0
char 0
signed char 0
unsigned char 0
wchar_t 0
char8_t (depuis 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 ou std:: ceil ( std:: numeric_limits < float > :: digits * std:: log10 ( 2 ) + 1 )
double DBL_DECIMAL_DIG ou std:: ceil ( std:: numeric_limits < double > :: digits * std:: log10 ( 2 ) + 1 )
long double DECIMAL_DIG ou LDBL_DECIMAL_DIG ou std:: ceil ( std:: numeric_limits < long double > :: digits * std:: log10 ( 2 ) + 1 )

Notes

Contrairement à la plupart des opérations mathématiques, la conversion d'une valeur flottante en texte et inversement est exacte tant qu'au moins max_digits10 sont utilisés ( 9 pour float , 17 pour double ) : il est garanti de produire la même valeur flottante, même si la représentation textuelle intermédiaire n'est pas exacte. Il peut falloir plus d'une centaine de chiffres décimaux pour représenter la valeur précise d'un float en notation décimale.

Exemple

#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);
}

Sortie :

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

Voir aussi

[static]
la base ou le système de numération entier utilisé par la représentation du type donné
(constante de membre public static)
[static]
nombre de chiffres en base radix qui peuvent être représentés sans changement
(constante de membre public static)
[static]
nombre de chiffres décimaux qui peuvent être représentés sans changement
(constante de membre public static)
un de plus que la plus petite puissance négative de la base qui est une valeur normalisée valide en virgule flottante
(constante de membre public static)
un de plus que la plus grande puissance entière de la base qui est une valeur finie valide en virgule flottante
(constante de membre public static)