Десятичная точность плаваний

эквивалентный log10 (2^24) ≈ 7,225 десятичных цифр

Википедия

Точность: 7 цифр

MSDN

6

std::numeric_limits::digits10

Почему numeric_limits возвращаются 6 сюда? И Википедия и MSDN сообщают, что плавания имеют 7 десятичных цифр точности.

12
задан skaffman 22 July 2010 в 15:27
поделиться

2 ответа

Если есть сомнения, прочтите спецификацию. В стандарте C ++ сказано, что digits10 - это:

Число десятичных цифр, которое может быть представлено без изменений.

Это немного расплывчато; к счастью, есть сноска:

Эквивалент FLT_DIG, DBL_DIG, LDBL_DIG

Они определены в стандарте C; давайте посмотрим там:

количество десятичных цифр, q, такое, что любое число с плавающей запятой с q десятичными цифрами может быть округлено до числа с плавающей запятой с p основанием b цифр и обратно без изменения q десятичного числа цифры.

Итак std :: numeric_limits :: digits10 - это количество десятичных цифр, так что любое число с плавающей запятой с таким количеством цифр не изменится, если вы преобразуете его в float и обратно в десятичную.

Как вы говорите, числа с плавающей запятой имеют примерно 7 цифр десятичной точности, но ошибка представления десятичных чисел фиксированной ширины и чисел с плавающей запятой не является равномерно логарифмической. Относительная ошибка округления числа вида 1.xxx .. до фиксированного числа десятичных знаков почти в десять раз больше , чем относительная ошибка округления 9.xxx .. до того же десятичного числа. места. Точно так же, в зависимости от того, где значение попадает в бинаду, относительная ошибка округления его до 24 двоичных цифр может варьироваться почти в два раза.

Результатом этого является то, что не все семизначные десятичные дроби выдерживают циклический переход к смещению и возврату, но все шестизначные десятичные числа выдерживают. Следовательно, std :: numeric_limits :: digits10 равно 6.

Для типа float не так много десятичных знаков с показателями степени в допустимом диапазоне; вы можете довольно легко написать программу для исчерпывающего тестирования всех из них, если вы все еще не уверены.

15
ответ дан 2 December 2019 в 19:52
поделиться

На самом деле в мантиссе всего 23 бита (есть подразумеваемая 1, так что фактически это 24 бита, но 1, очевидно, не меняется). Это дает 6,923689900271567 десятичных цифр точности, что не совсем 7.

2
ответ дан 2 December 2019 в 19:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: