эквивалентный log10 (2^24) ≈ 7,225 десятичных цифр
Точность: 7 цифр
6
std::numeric_limits
::digits10 Почему numeric_limits возвращаются 6 сюда? И Википедия и MSDN сообщают, что плавания имеют 7 десятичных цифр точности.
Если есть сомнения, прочтите спецификацию. В стандарте C ++ сказано, что digits10
- это:
Число десятичных цифр, которое может быть представлено без изменений.
Это немного расплывчато; к счастью, есть сноска:
Эквивалент FLT_DIG, DBL_DIG, LDBL_DIG
Они определены в стандарте C; давайте посмотрим там:
количество десятичных цифр, q, такое, что любое число с плавающей запятой с q десятичными цифрами может быть округлено до числа с плавающей запятой с p основанием b цифр и обратно без изменения q десятичного числа цифры.
Итак std :: numeric_limits
- это количество десятичных цифр, так что любое число с плавающей запятой с таким количеством цифр не изменится, если вы преобразуете его в float
и обратно в десятичную.
Как вы говорите, числа с плавающей запятой имеют примерно 7 цифр десятичной точности, но ошибка представления десятичных чисел фиксированной ширины и чисел с плавающей запятой не является равномерно логарифмической. Относительная ошибка округления числа вида 1.xxx .. до фиксированного числа десятичных знаков почти в десять раз больше , чем относительная ошибка округления 9.xxx .. до того же десятичного числа. места. Точно так же, в зависимости от того, где значение попадает в бинаду, относительная ошибка округления его до 24 двоичных цифр может варьироваться почти в два раза.
Результатом этого является то, что не все семизначные десятичные дроби выдерживают циклический переход к смещению и возврату, но все шестизначные десятичные числа выдерживают. Следовательно, std :: numeric_limits
равно 6.
Для типа float
не так много десятичных знаков с показателями степени в допустимом диапазоне; вы можете довольно легко написать программу для исчерпывающего тестирования всех из них, если вы все еще не уверены.
На самом деле в мантиссе всего 23 бита (есть подразумеваемая 1, так что фактически это 24 бита, но 1, очевидно, не меняется). Это дает 6,923689900271567 десятичных цифр точности, что не совсем 7.