C, значение FLT_MAX больше 32 бит? - PullRequest
0 голосов
/ 13 ноября 2018

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

Я обнаружил, что значения с плавающей запятой хранятся в 32 битах, из которых 1 бит для знака, 7 бит для экспоненты и остальные для мантиссы.

Когда у меня возникают проблемы, когда я отображаю FLT_MAX с printf, я получу 340282346638528859811704183484516925440.000000, просто выполнив printf("%f\n", FLT_MAX)

Это значение больше, чем INT_MAX, больше, чем LLONG_MAX, как это число может быть сохранено в 32 битах? Это действительно 32 бита или зависит от системы? Я на Ubuntu x86_64 GNU/Linux.

Я не могу понять, как более 10 цифр (INT_MAX len) могут храниться в одном и том же количестве битов.

Если думаете, что проблема связана, но у меня также есть проблема для двойника, который даст мне

printf("%lf", DBL_MAX);
#179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000

Это делает тайну больше! Спасибо за помощь, надеюсь, я был ясен.

1 Ответ

0 голосов
/ 13 ноября 2018

Биты - это просто физические вещи с двумя состояниями. Для них нет никакого внутреннего значения. Когда мы используем биты для представления целого числа в двоичном коде, мы интерпретируем каждый бит как имеющий значение, 1 для одного бита, 2 для другого, 4 для другого, 8 для другого и так далее. В физике, логике или законе нет ничего, что требовало бы от нас такой интерпретации.

Когда мы используем биты для представления объекта с плавающей запятой, мы придаем каждому биту различное значение. Один бит представляет знак. Восемь битов содержат кодировку показателя степени. 23 бита содержат кодирование значения.

Чтобы выяснить значение битов при заданной схеме кодирования с плавающей запятой для чисел в нормальном диапазоне, мы интерпретируем экспонентные биты как двоичное число, затем вычитаем 127, а затем увеличиваем два до полученной степени. (Например, «10000011» - это двоичная цифра для 131, поэтому она представляет 2 4 ). Затем мы берем битызначностей и добавляем их к «1», образуя двоичную цифру, например «1.01011100000000000000000». , Мы конвертируем эту цифру в число (это 159/128) и умножаем его на степень от показателя степени (в этом примере получаем 159/8) и применяем знак.

Поскольку показатель степени может быть большим, представленное значение может быть очень большим. Программное обеспечение, которое преобразует числа с плавающей запятой в символы для вывода, например «340282346638528859811704183484516925440.000000», выполняет эти интерпретации для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...