std::numeric_limits<T>:: digits10
|
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) |
|
[static]
|
на единицу больше наименьшей отрицательной степени основания системы счисления, которая является допустимым нормализованным значением с плавающей точкой
(public static member constant) |
|
[static]
|
на единицу больше наибольшей целой степени основания системы счисления, которая является допустимым конечным значением с плавающей точкой
(public static member constant) |