Namespaces
Variants

std::numeric_limits<T>::max_digits10

From ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы проверки возможностей библиотеки (C++20)
Программные утилиты
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
 
 
 
static constexpr int max_digits10
(начиная с C++11)

Значение std::numeric_limits<T>::max_digits10 — это количество десятичных цифр (по основанию 10), необходимое для однозначного представления всех различных значений типа T, например, необходимое для сериализации/десериализации в текст. Эта константа имеет смысл для всех типов с плавающей точкой.

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

**Примечание:** В данном фрагменте HTML: - Термины C++ (`unsigned char`) не переведены в соответствии с требованиями - Числовое значение `0` оставлено без изменений - Все HTML-теги и атрибуты сохранены в оригинальном виде - Форматирование полностью сохранено **Объяснение перевода:** - HTML-теги и атрибуты сохранены без изменений - Текст внутри тегов `` не переведен, так как это C++ код - C++ специфические термины (`unsigned short`, `0`) не переведены - Форматирование и структура полностью сохранены - Перевод не требовался, так как весь текст содержал только HTML-разметку и C++ код **Примечание:** В данном случае переводить нечего, так как: - `long` - C++ специфический термин (не переводится) - `0` - числовое значение (не переводится) - Весь текст находится внутри HTML тегов и классов, связанных с кодом C++ - Остальные элементы - HTML разметка и атрибуты (сохранены без изменений) **Примечание:** В данном фрагменте HTML не содержится переводимого текста - все содержимое состоит из HTML-тегов, атрибутов, C++ ключевых слов (`unsigned`, `long`) и числового значения (`0`), которые согласно инструкциям не подлежат переводу.
T Значение std:: numeric_limits < T > :: max_digits10
/* неспециализированный */ ​ 0 ​
bool ​ 0 ​
char ​ 0 ​
signed char ​ 0 ​
unsigned char ​ 0 ​
wchar_t ​ 0 ​
char8_t (начиная с 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 или std:: ceil ( std:: numeric_limits < float > :: digits * std:: log10 ( 2 ) + 1 )
double DBL_DECIMAL_DIG или std:: ceil ( std:: numeric_limits < double > :: digits * std:: log10 ( 2 ) + 1 )
long double DECIMAL_DIG или LDBL_DECIMAL_DIG или std:: ceil ( std:: numeric_limits < long double > :: digits * std:: log10 ( 2 ) + 1 )

Примечания

В отличие от большинства математических операций, преобразование значения с плавающей точкой в текст и обратно является точным при условии использования как минимум max_digits10 ( 9 для float , 17 для double ): гарантируется получение того же значения с плавающей точкой, даже если промежуточное текстовое представление не является точным. Для представления точного значения float в десятичной записи может потребоваться более ста десятичных цифр.

Пример

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

Вывод:

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

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

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