Как я могу преобразовать 32-битное двоичное число в число с плавающей запятой?

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

Как я могу вручную преобразовать это 32-битное двоичное число в число с плавающей запятой без использования программирования или преобразователя?

Спасибо,

Дэн


person Supertecnoboff    schedule 24.01.2013    source источник
comment
В Википедии есть достаточно четкое описание того, как разбить значение вниз.   -  person RB.    schedule 24.01.2013
comment
является ли этот двоичный шаблон целым числом (не с плавающей запятой), которое вы хотите знать, как выглядит версия этого числа с плавающей запятой? Или этот двоичный шаблон представляет собой число с плавающей запятой, и вы хотите знать, как это выглядит в десятичном виде 123,45678, как угодно?   -  person old_timer    schedule 24.01.2013


Ответы (2)


Предполагая, что вы ищете одну плавающую точку, вот формат:

Первая цифра — знак, следующие 8 — показатель степени и, наконец, последние 23 — мантиссы.

Для вашего номера (001111110100000000000000000000000)

Знак: 0 равен +
Показатель степени: 01111110 равен -1 (126-127)
Значение: 100000000000000000000000 равно 1,5 («невидимый» первый бит дает вам 1, затем второй бит (только один набор) 0,5, следующий был бы 0,25, потом 0,125 и так далее)

Затем вы вычисляете значение следующим образом:

sign * 2^exp * Significand

1 * 2^-1 * 1,5
1 * 0,5 * 1,5
0,75

Ваше число с плавающей запятой равно 0,75.

person Pierre-Luc    schedule 24.01.2013

Если вы немного просмотрите Википедию и другие места, вы узнаете, что стандарты с плавающей запятой (существуют разные стандарты, IEEE754 является наиболее известным, поскольку он используется на настольных компьютерах и т. вычисляются быстрее)) "нормализует" число. С плавающей запятой все зависит от того, где находится десятичная точка, целое число без плавающей запятой имеет подразумеваемую десятичную точку справа от числа.

00111111010000000000000000000000. <--- here

кроме всех нулей для нормализации, давайте предположим, что мы используем формат, который хочет, чтобы число было 1.xxxx в двоичном формате, поэтому нам нужно переместить нашу десятичную точку

001.11111010000000000000000000000

десятичный знак был перемещен сразу после самого значимого (так что только одна 1 находится слева от десятичной точки).

если вы помните из школьного курса математики, то 123 можно записать как 1,23 * 10^2 (десять в степени 2). 123 тоже 123*10^0. Каждое место, на которое вы перемещаете десятичную дробь влево в числе с основанием 10, увеличивает степень числа 10 на единицу. Каждое место справа уменьшается. В двоичном коде, основанном на 2, нет никакой разницы, каждое место, где вы перемещаете десятичную дробь влево, увеличивает степень 2 (двоичное число — это основание 2), на каждое место вправо вы уменьшаете степень 2.

Итак, чтобы быть точным, наш номер сейчас

1.1111101 * 2^30

Теперь вступают в игру детали формата с плавающей запятой. Поскольку предполагается, что 1 слева от десятичной точки (за исключением точного числа ноль и некоторых других исключений) присутствует, иногда его нет в окончательном двоичном представлении для этого числа с плавающей запятой, это пустая трата места для поместите бит, который, как мы знаем, всегда равен единице, когда вместо этого мы могли бы иметь еще один бит для мантиссы. Мантиссы часто выражаются в двоичном формате, экспонента - это та, которая заставляет вас почесать голову, особенно с IEEE754. Например, показатель степени 128 в двоичном формате числа может представлять 2 в степени 0, а 129 может быть 2 в степени 1 и так далее. это может показаться странным, но для некоторых из этих форматов это не что иное, как поле дополнения до двух, в других есть другие способы сделать что-то. Одиночный, двойной, расширенный имеют разное количество битов для показателя степени, и вам нужно выяснить, что вы добавляете к реальному показателю (в данном случае 30), чтобы получить битовый шаблон, который идет в поле показателя степени числа с плавающей запятой.

другой пример

0000000000000000000000000000000000000101

было бы

1.01 * 2^2

если вы начинаете с 32-битного целого числа (не с плавающей запятой) и хотите получить 32-битное число с плавающей запятой, вы, очевидно, не можете сохранить все детали этого числа, поскольку для числа с плавающей запятой требуется бит знака и показатель степени, а также мантисса, мантисса меньше 32 бит, поэтому вы отбрасываете младшие значащие биты

1000000000000000000000000000001  

в какой-то момент будет отрублен:

1.000000000000000 * 2^something
person old_timer    schedule 24.01.2013