Spec-Zone.ru › C++

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 десятичных знаков.

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/numeric_limits/digits10

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API