std::numeric_limits<T>::digits10
static const int digits10; | (до C++11) | |
static constexpr int digits10; | (с C++11) |
Значение std::numeric_limits<T>::digits10 равно количеству цифр в системе счисления с основанием 10, которые могут быть представлены типом T без изменения, то есть любое число с таким количеством значащих десятичных цифр может быть преобразовано в значение типа T и обратно в десятичную форму без изменений из-за округления или переполнения. Для типов с основанием основанием, это значение digits() (digits - 1 для типов с плавающей точкой) умноженное на \(\small \log_{10}{radix}\)log10(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 квадруплетного) |
Пример
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-битный тип с плавающей точкой и обратно: наименьший положительный пример — 8.589973e9, который становится 8.589974e9 после преобразования туда и обратно. Эти ошибки округления не могут превышать одного бита в представлении, и digits10 вычисляется как (24 - 1) * std::log10(2), что равно 6.92. Округление вниз приводит к значению 6.
Точно так же 16-значная строка 9007199254740993 не выживает при преобразовании текст->double->текст, становясь 9007199254740992: 64-битный тип с плавающей точкой IEEE 754 double гарантирует это преобразование только для 15 десятичных знаков.
См. также
|
[статический] (C++11) | количество десятичных знаков, необходимых для различения всех значений этого типа (публичная статическая константа) |
|
[статический] | основание системы счисления, используемое для представления данного типа (публичная статическая константа) |
|
[статический] | количество цифр в системе счисления, которые могут быть представлены без изменений (публичная статическая константа) |
|
[статический] | на один больше наименьшей отрицательной степени основания, являющейся допустимым нормализованным значением с плавающей точкой (публичная статическая константа) |
|
[статический] | на один больше наибольшей целой степени основания, являющейся допустимым конечным значением с плавающей точкой (публичная статическая константа) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/numeric_limits/digits10