2014-01-15 5 views
3

0.1 в базе10 не имеет соответствующего соответствия в двойном представлении.base10 и с плавающей запятой

Есть ли в C++ гарантии, что номер base10 без дробной части и с числом цифр минус или равным std :: numeric_limits :: digit10 имеет обязательное правильное/точное двойное представление?

+1

Я не думаю, что есть гарантия, но с удвоением IEEE (безусловно, наиболее распространенным видом) вы найдете его на практике. –

ответ

0

Я считаю, что есть такая гарантия, по определению std::numeric_limits::digit10 (при условии, что она выполнена правильно, конечно). Родственная обсуждение (см верхнего ответа): What is the meaning of numeric_limits<double>::digits10

3

Пер 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 десятичных цифр.

Смежные вопросы