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

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

Wikipedia

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

MSDN

6

std::numeric_limits<float>::digits10

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

Ответ 1

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

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

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

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

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

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

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

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

Результат состоит в том, что не все семизначные десятичные числа переживают поездку туда и обратно, а все шестизначные десятичные числа делают. Следовательно, std::numeric_limits<float>::digits10 равно 6.

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

Ответ 2

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