Ответ 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
; вы можете довольно легко написать программу, чтобы полностью проверить их все, если вы все еще не уверены.