Преобразование числа в IEEE 754 - PullRequest
1 голос
/ 08 июня 2019

Может кто-нибудь помочь мне с этим вопросом:

“Преобразование десятичного числа 10/32 в 32-разрядную IEEE 754 с плавающей запятой и выразить свой ответ в шестнадцатеричном. (Напоминание: 32 бита используются как следующим образом: Бит 1: знак мантиссы, биты 2-9: 8-битный показатель степени, превышающий 127, биты 10-32: 23 бита для величины мантиссы.) ”

Я понимаю, как преобразовать десятичное число в IEE 754. Но я не совсем понимаю, как на это ответить - это только дает мне частное? Мне не разрешают пользоваться калькулятором, поэтому я не уверен, как это решить. Должен ли я сначала преобразовать их в двоичный файл и разделить их?

Ответы [ 3 ]

1 голос
/ 08 июня 2019

10/32 = 5/16 = 5 • 2 −4 = 1,25 • 2 −2 = 1,01 2 • 2 −2.

Знак +, показатель степени -2, а значение 1.01 2 .

Положительный знак кодируется как 0.

Экспонент −2 кодируется как -2 + 127 = 125 = 01111101 2 .

Значение 1,01 2 равно 1,01000000000000000000000 2 и кодируется с использованием последних 23 битов, 01000000000000000000000 2 .

Собирая их вместе, кодировка IEEE-754 равна 0 01111101 01000000000000000000000. Чтобы преобразовать в шестнадцатеричное, сначала объедините в группы почетыре бита: 0011 1110 1010 0000 0000 0000 0000 0000. Затем шестнадцатеричный код легко читается: 3EA00000 16 .

0 голосов
/ 08 июня 2019

Я вижу это так:

10/32 =        // input
10/2^5 =       // convert division by power of 2 to bitshift
1010b >> 5 =
.01010b        // fractional result
--^-------------------------------------------------------------
  |
first nonzero bit is the exponent position and start of mantissa
----------------------------------------------------------------
man = (1)010b           // first one is implicit
exp = -2 + 127 = 125    // position from decimal point + bias
sign = 0                // non negative
----------------------------------------------------------------
0 01111101 01000000000000000000000 b
^    ^                ^
|    |            mantissa + zero padding
|   exp
sign
----------------------------------------------------------------
0011 1110 1010 0000 0000 0000 0000 0000 b
   3    E    A    0    0    0    0    0 h
----------------------------------------------------------------
3EA00000h

Да, ответ Эрика Постпишила - тот же подход (+1 к слову), но мне не понравилось форматирование, так как с первого взгляда не было ясно, что делать без правильного чтения текста.

0 голосов
/ 08 июня 2019

Давать преобразование 10/322 без калькулятора в качестве упражнения - это чистый садизм.

Существует общий метод, который можно выполнить без инструментов, но он может быть утомительным.

N is the number to code. We assume n<1
exp=0
mantissa=0 
repeat 
  n *= 2
  exp ++
  if n>1
    n = n-1
    mantissa = mantissa <<1 | 1
  else
    mantissa = mantissa <<1
until mantissa is a 1 followed by 23 bits

Тогда вам просто нужно кодировать mantissa и (23-exp) в формате IEEE.

Обратите внимание, что часто такого рода вычисления приводят к циклам.Всякий раз, когда вы находите тот же самый n, вы знаете, что последовательность будет повторяться.

В качестве примера предположим, что мы должны кодировать 3/14

3/14  -> 6/14  e=1 m=0  
6/14  -> 12/14 e=2 m=00
12/14 -> 24/14-14/14=10/14 e=3 m=001
10->14 -> 20/14-14/14=6/14 e=4 m=0011
6/14   -> 12/14 e=5 m=00110

Отлично, мы нашли цикл!
6 / 14-> 12 / 14-> 10 / 14-> 6 / 14.
Таким образом, мантисса будет итерацией 110, как требуется 110110110 ...

Если мы наполним мантиссу 24бит, нам нужно 26 итераций, а показатель степени равен 23-26 = -3 (еще один способ получить это - заметить, что n стало> 1 впервые на итерации 3, а показатель степени равен -3 как 1≤3 / 14 * 2 ^3 <2). </p>

И мы можем сделать кодирование IEEE754 с показателем степени = 127-3 = 124 и мантиссой = 1.1011011011011 ....

...