Декодирование представления с плавающей запятой
В битах 0 1110 00001, которые представляют число с плавающей запятой:
- 0 - это бит знака s .
- 1110 - поле экспоненты e . (Это не показатель степени; это кодировка показателя степени.)
- 00001 - это значение * 1 поле f . (Это не значение, а кодирование значения.)
Эти биты интерпретируются:
- Знаковый бит с - это используется в (−1) s для обозначения знака. Для 0 (-1) 0 = +1, поэтому представленное число является положительным.
- Поле экспоненты e корректируется путем вычитания смещения, чтобы получить фактический показатель Вопрос не указывает, что использовать для смещения, но мы можем предположить, что это 7, поскольку это то, что было бы по шаблону IEEE-754. Для поля экспоненты 1110, которое является двоичным для 14, фактическая экспонента равна 14-7 = 7. Это означает, что представленное число будет масштабировано до 2 7 .
- До тех пор, пока экспонента поле - это не все нули или все единицы, поле значений и f интерпретируется путем написания «1», добавления битов поля значений и преобразования и интерпретации его как двоичного числа. 2 Для битов 00001 у нас есть 1,00001, что составляет 1 + 1/32. Это значение и F .
- Все вместе представленное число равно (−1) s • 2 e −7 • F = +1 • 2 7 • (1 + 1/32) = 128 • (1 + 1/32) = 128 + 4 = 132.
Кодирование представления с плавающей точкой
Чтобы кодировать 00000101, мы не начинаем с первого заданного бита. Мы находим первое значащее число di git, которое для двоичного файла является первым 1 битом. В 00000101 первый бит 1 находится в позиции 2 (соответствует значению 2 2 ). Затем, чтобы сформировать значение, мы берем оттуда шесть битов, а не пять. Поле значений и составляет пять битов, а значение и - шесть битов, поскольку для чисел в нормальном диапазоне он включает в себя начальный бит, который кодируется через поле экспоненты. В 00000101 шесть битов, которые нам нужны для значения, равны 101000. Последние три бита являются неявными. Таким образом, значение: 1.01000.
Для кодирования этого числа, которое является положительным, имеет показатель степени 2 и имеет значение, и 1.01000, мы используем 0 для знакового бита, 2 + 7 для поля экспоненты и 01000 для значимое поле, поэтому кодировка составляет 0 1001 01000.
Если после первых шести значащих цифр в номере были ненулевые биты, фактическое число не может быть представлено в этом формате с плавающей запятой. В этом случае мы можем либо объявить ошибку, что преобразование не может быть выполнено, либо мы можем округлить число до ближайшего представимого значения. Чаще всего округление выполняется путем округления числа до ближайшего представимого значения - если биты после того, что вписывается в значение и начинаются с 0, округляются в меньшую сторону. Если они начинаются с 1 и включают хотя бы еще одну 1, округлите их в большую сторону. Если они начинаются с 1 и все цифры после этого являются нулями, то число находится посередине между двумя представимыми значениями, и обычное правило состоит в том, чтобы выбрать представимое значение с четным малым di git (сделать последний di git из значение и 0).
Сноски
1 «Значение» - это предпочтительный термин для дробной части (по сравнению с показателем степени или знаком) числа с плавающей запятой. «Мантисса» - это старый термин для дробной части логарифма. Мантиссы являются логарифмическими; добавление к мантиссе умножает представленное число. Значения линейны; умножение значимого и умножение представленного числа.
2 Если поле экспоненты e - все нули, то оно представляет показатель степени 1 минус смещение и поле значимого интерпретируется как «0» следуют биты поля вместо «1».