Преобразовать целое число в число с плавающей точкой IEEE? - PullRequest
0 голосов
/ 06 апреля 2020

Я сейчас читаю «Компьютерные системы: взгляд программиста». В книге используется big-endian (сначала наиболее значимые биты). В контексте чисел с плавающей запятой IEEE, использующих 32-битную одинарную точность, здесь приводится пример преобразования между целым числом и плавающей запятой IEEE:

Одним из полезных упражнений для понимания представлений с плавающей запятой является преобразовать примерные целочисленные значения в форму с плавающей точкой. Например, на рисунке 2.15 мы видели, что 12,345 имеет двоичное представление [11000000111001]. Мы создаем нормализованное представление этого, сдвигая 13 позиций вправо от двоичной точки, давая 12,345 = 1,10000001110012 × 2 ^ 13. Чтобы закодировать это в формате IEEE с одинарной точностью, мы создаем поле дроби, отбрасывая ведущий 1 и добавляя 10 нулей в конец, давая двоичное представление [10000001110010000000000]. Чтобы построить поле экспоненты, мы добавляем смещение 127 к 13, давая 140, которое имеет двоичное представление [10001100]. Мы комбинируем это со знаковым битом 0, чтобы получить представление с плавающей запятой в двоичном виде [01000110010000001110010000000000].

Что я не понимаю, так это «отбросить ведущий 1 и добавить 10 нулей к конец, давая двоичное представление [10000001110010000000000]. " Если используется big-endian, почему вы можете добавить 10 нулей к концу 1000000111001? Разве это не приводит к другому значению, чем после двоичной точки? Для меня будет иметь смысл, если мы добавим 10 нулей впереди, поскольку окончательное десятичное значение будет таким же, как и после двоичной точки.

Почему / как вы можете добавить 10 нулей к обороту, не меняя значения, если используется big-endian?

1 Ответ

0 голосов
/ 06 апреля 2020

Вот как число 12345 представляется в виде 32-разрядного числа с плавающей запятой IEEE754 одинарной точности:

                  3  2          1         0
                  1 09876543 21098765432109876543210
                  S ---E8--- ----------F23----------
          Binary: 0 10001100 10000001110010000000000
             Hex: 4640 E400
       Precision: SP
            Sign: Positive
        Exponent: 13 (Stored: 140, Bias: 127)
       Hex-float: +0x1.81c8p13
           Value: +12345.0 (NORMAL)

Поскольку это значение NORMAL, дробная часть интерпретируется с неявным 1 бит; то есть это 1.10000001110010000000000. Итак, чтобы заполнить 23-битную мантиссу, вы просто добавляете 10 0 в конце, поскольку это не меняет значение.

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

...