Namespaces
Variants

std::numeric_limits<T>:: max_digits10

From cppreference.net
Utilities library
static constexpr int max_digits10
(начиная с C++11)

Значение std:: numeric_limits < T > :: max_digits10 — это количество цифр в десятичной системе счисления, необходимое для однозначного представления всех различных значений типа 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)