Как хранятся в памяти числа с плавающей запятой?

Я читал, что они хранятся в виде мантиссы и экспоненты

Я читал этот документ, но ничего не смог понять.

33
задан Sid S 23 July 2019 в 20:34
поделиться

2 ответа

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

В отличие от целых чисел, значение с плавающей точкой предназначено для представления как чрезвычайно малых значений, так и чрезвычайно больших. Для обычных 32-битных значений с плавающей запятой это соответствует значениям в диапазоне от 1.175494351 * 10 ^ -38 до 3.40282347 * 10 ^ + 38 .

.

Очевидно, что, используя только 32 бита, невозможно сохранить каждую цифру в таких числах.

Когда дело доходит до представления, вы можете видеть все нормальные числа с плавающей запятой как значение в диапазоне от 1,0 до (почти) 2,0, масштабированное со степенью двойки. Так что 1.0 - это просто 1,0 * 2 ^ 0 . 2,0 составляет 1,0 * 2 ^ 1 . -5,0 -1,25 * 2 ^ 2 .

Итак, что нужно, чтобы закодировать это настолько эффективно, насколько это возможно? Что нам действительно нужно?

  • Знак выражения.
  • Показатель степени
  • Значение в диапазоне от 1,0 до (почти) 2,0. Это известно как "мантисса", то есть значение.

Это кодируется следующим образом, в соответствии со стандартом IEEE-754 с плавающей запятой.

  • Знак является одним битом.
  • Показатель степени сохраняется в виде целого числа без знака, для 32-битных значений с плавающей запятой это поле составляет 8 битов. 1 представляет наименьший показатель степени, а «все единицы - 1» наибольший. (0 и «все единицы» используются для кодирования специальных значений, см. Ниже.) Значение в середине (127, в 32-битном случае) представляет ноль, это также известно как смещение .
  • Глядя на мантиссу (значение от 1,0 до (почти) 2,0), можно увидеть, что все возможные значения начинаются с «1» (как в десятичном, так и в двоичном представлении). Это означает, что нет смысла хранить его. Остальные двоичные цифры хранятся в целочисленном поле, в 32-битном случае это поле составляет 23 бита.

В дополнение к обычным значениям с плавающей запятой, существует ряд специальных значений:

  • Ноль кодируется с показателем степени и мантиссой в качестве нуля. Знаковый бит используется для обозначения «плюс ноль» и «минус ноль». Минус ноль полезен, когда результат операции чрезвычайно мал, но все равно важно знать, из какого направления пришла операция.
  • плюс и минус бесконечность - представлены с использованием показателя «все единицы» и нулевого поля мантиссы.
  • Не число (NaN) - представлено с использованием показателя «все единицы» и ненулевой мантиссы.
  • Денормализованные числа - числа, меньшие наименьшего нормального числа. Представлено с использованием поля нулевого показателя и ненулевой мантиссы. Особенность этих чисел в том, что точность (то есть количество цифр, которое может содержать значение) будет падать по мере уменьшения значения просто потому, что для них нет места в мантиссе.

Наконец, ниже приводится несколько конкретных примеров (все значения в шестнадцатеричном формате):

  • 1.0: 3f800000
  • -1234.0: c49a4000
  • 100000000000000000000000.0: 65a96816
47
ответ дан 27 November 2019 в 18:03
поделиться

Мантисса представляет наиболее значимые биты числа.

Показатель степени показывает, сколько смен должно быть выполнено на мантиссе, чтобы получить фактическое значение числа.

Кодировка определяет, как представлены знак мантиссы и знак экспоненты (в основном, смещается ли влево или вправо).

В документе, на который вы ссылаетесь, указывается кодировка IEEE, наиболее широко используемая.

1
ответ дан 27 November 2019 в 18:03
поделиться
Другие вопросы по тегам:

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