Пер Dietmar Kühl’s answer, утверждение в стандарте C++ означает, что целые числа в [0, гд) может быть представлена в точности, где г является std::numeric_limits<type>::radix
и d является std::numeric_limits<type>::digits
.
Это, в свою очередь, подразумевает, что целое число не более std::numeric_limits<type>::digits10
цифр 10-го разряда может быть представлено точно.
Помимо: Есть некоторые проблемы с определением языка C++ стандарта в std::numeric_limits<type>::digits10
.
Стандарт говорит, что это «Количество базовых 10 цифр, которые могут быть представлены без изменений». Предполагается, что это просто простые базовые 10 цифр, т. Е. Целые числа, или это утверждение о точности во всем диапазоне Формат? Сноска, которая не является нормативной, говорит, что это эквивалентно FLT_DIG, DBL_DIG и LDBL_DIG, которые определяются с помощью стандарта C. Стандарт Си дает два определения в одном операторе:
количество десятичных цифр, д, такие, что любое число с плавающей точкой с д десятичных цифр может быть округлено в число с плавающей точкой с р радикс б цифры и обратно без изменений к д десятичных цифр,
и:
р журнал б, если б является мощность 10
пола ((р -1) войти б) в противном случае
Я не верьте, что первое является хорошим определением. Последнее дает нам 7 для 32-битной двоичной с плавающей запятой IEEE-754, но 1.5e-45 - это число с плавающей запятой, состоящее из 2 десятичных цифр, и округление его до IEEE-754 32-битной двоичной с плавающей запятой и обратно дает 1.401 ... e-45 (потому что он находится в субнормальном интервале). Таким образом, неверно, что любое число с плавающей запятой с 7 десятичными цифрами может быть округлено до плавающей запятой и обратно без изменения 7 десятичных цифр.
Я не думаю, что есть гарантия, но с удвоением IEEE (безусловно, наиболее распространенным видом) вы найдете его на практике. –