Namespaces
Variants

std::numeric_limits<T>:: digits10

From cppreference.net
Utilities library
static const int digits10 ;
(до C++11)
static constexpr int digits10 ;
(начиная с C++11)

Значение std:: numeric_limits < T > :: digits10 представляет количество цифр в десятичной системе счисления, которые могут быть представлены типом T без изменений, то есть любое число с таким количеством значащих десятичных цифр может быть преобразовано в значение типа T и обратно в десятичную форму без изменений из-за округления или переполнения. Для типов с основанием radix это значение digits() ( digits - 1 для типов с плавающей точкой), умноженное на log 10 (radix) и округлённое в меньшую сторону.

Стандартные специализации

T значение std:: numeric_limits < T > :: digits10
/* неспециализированный */ 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 (начиная с C++20) std:: numeric_limits < char8_t > :: digits * std:: log10 ( 2 )
char16_t (начиная с C++11) std:: numeric_limits < char16_t > :: digits * std:: log10 ( 2 )
char32_t (начиная с 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 (начиная с C++11) std:: numeric_limits < long long > :: digits * std:: log10 ( 2 )
unsigned long long (начиная с C++11) std:: numeric_limits < unsigned long long > :: digits * std:: log10 ( 2 )
float FLT_DIG ( 6 для IEEE float )
double DBL_DIG ( 15 для IEEE double )
long double LDBL_DIG ( 18 для 80-битного Intel long double ; 33 для IEEE quadruple)

Пример

8-битный двоичный тип может точно представлять любое двузначное десятичное число, но трехзначные десятичные числа 256..999 не могут быть представлены. Значение digits10 для 8-битного типа равно 2 ( 8 * std:: log10 ( 2 ) равно 2.41)

Стандартный 32-битный тип с плавающей точкой IEEE 754 имеет 24-битную дробную часть (23 бита записываются, один подразумевается), что может наводить на мысль о возможности представления 7 десятичных цифр ( 24 * std:: log10 ( 2 ) равно 7.22), однако относительные ошибки округления распределены неравномерно, и некоторые значения с плавающей точкой, имеющие 7 десятичных цифр, не сохраняются при преобразовании в 32-битный float и обратно: наименьший положительный пример — 8.589973e9 , который становится 8.589974e9 после двойного преобразования. Эти ошибки округления не могут превышать один бит в представлении, и digits10 вычисляется как ( 24 - 1 ) * std:: log10 ( 2 ) , что составляет 6.92. Округление вниз даёт значение 6.

Аналогично, 16-значная строка 9007199254740993 не сохраняется при преобразовании текст->double->текст, превращаясь в 9007199254740992 : 64-битный IEEE 754 тип double гарантирует такое преобразование только для 15 десятичных цифр.

Смотрите также

[static] (C++11)
количество десятичных цифр, необходимое для различения всех значений данного типа
(public static member constant)
[static]
основание системы счисления, используемое для представления данного типа
(public static member constant)
[static]
количество цифр в системе счисления radix , которые могут быть представлены без изменения
(public static member constant)
на единицу больше наименьшей отрицательной степени основания системы счисления, которая является допустимым нормализованным значением с плавающей точкой
(public static member constant)
на единицу больше наибольшей целой степени основания системы счисления, которая является допустимым конечным значением с плавающей точкой
(public static member constant)