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

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

Это то, что я до сих пор понял.

  1. Им требуется 64 бита в памяти
  2. Consist of three parts
    • Sign bit (1 bit long)
    • Экспонента (длина 11 бит)
    • Дробь (53 бита, предполагается, что первый бит всегда равен 1, поэтому сохраняются только 52 бита, кроме случаев, когда все 52 бита равны 0. Тогда ведущий бит предполагается равным 0)

Однако я не понимаю, что такое экспонента, смещение экспоненты и все эти формулы на странице википедии.

Может ли кто-нибудь объяснить мне, что это все за штуки, как они работают и, в конечном итоге, шаг за шагом вычисляются до реального числа?


person Oybek    schedule 04.02.2012    source источник
comment
Возможный дубликат stackoverflow.com/questions/6535343/ Посмотрите лучший ответ. То же самое, но с большим количеством бит для мантиссы и экспоненты.   -  person Ram    schedule 04.02.2012
comment
возможный дубликат Почему число с плавающей точкой одинарной точности IEEE754 только 7 точность цифр? Ответ и первый комментарий все кратко объясняют   -  person Ron    schedule 14.12.2013
comment
Как работает IEEE754 и как рассчитывается реальное число (точность) - это два разных вопроса. Я предлагаю вам начать с изучения того, как работает IEEE754 с плавающей запятой, а затем взглянуть на связанный выше вопрос   -  person Ron    schedule 14.12.2013


Ответы (3)


Ознакомьтесь с формулой чуть ниже по странице:

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

(-1) ^ знак * 2 ^ (показатель степени - смещение) * 1. мантисса

Формула означает, что для чисел, отличных от NAN, INF, ненулевых и ненормальных (которые я проигнорирую), вы берете биты в мантиссе и добавляете неявный 1 бит вверху. Это делает мантиссу 53 битами в диапазоне 1.0 ... 1.111111 ... 11 (двоичный). Чтобы получить фактическое значение, вы умножаете мантиссу на 2 в степени экспоненты минус смещение (1023) и либо инвертируете результат, либо нет, в зависимости от знакового бита. Число 1.0 будет иметь несмещенный показатель степени равный нулю (т.е. 1.0 = 1.0 * 2 ^ 0), а его смещенный показатель будет равен 1023 (смещение просто добавлено к показателю). Итак, 1.0 будет sign = 1, exponent = 1023, mantissa = 0 (вспомните скрытый бит мантиссы).

Если сложить все вместе в шестнадцатеричном формате, получится 0x3FF000000000 == 1.0.

person Richard Pennington    schedule 04.02.2012
comment
Извините, я не понимаю, как можно [...] умножить мантиссу на 2 в степени экспоненты [...]. Мантисса - это комбинация единиц и нулей, как и показатель степени. Должно ли этому предшествовать что-то вроде Преобразовать двоичное представление мантиссы в десятичное с помощью ...? - person Confounded; 15.06.2018

  • Знак: 1, если отрицательный, 0, если положительный
  • Фракция: инженерное плавающее представление в двоичном режиме.
  • Показатель степени: это показатель степени e, такой, что fraction * 2^e равно числу, которое я хочу представить.
  • Смещение - это число, которое необходимо вычесть из экспоненты, чтобы получить правильное представление. При двойной точности - 1023, при одинарной - 127.

пример (с одинарной точностью мне удобнее писать =)): если мне нужно было rappresent -0,75, я делаю: - двоичное представление будет -11 * 2^-2 = -1.1 * 2^-1

  • знак = 1
  • дробь = 1 + .1000 ....
  • смещенная экспонента: -1 + 127 = 126 -> 01111110

так что у нас было -0.75 = 1 01111110 10000000000000000000000

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

Для умножения вам нужно

  • суммируйте экспоненту и вычитая смещение
  • умножить дробную часть
  • округление результата
  • посмотрите на знак (если у вас такой же знак, значит, знак = 0, иначе знак = 1)
person zambotn    schedule 04.02.2012

person    schedule
comment
@ пожалуйста, если в этом коде есть ошибка, и вы хотите ее исправить, пожалуйста, заполните бесплатно и исправьте. - person s.zen; 30.09.2015