То есть формат A для формата B путем округления
Итак, у меня есть два 9-битных представления с плавающей запятой на основе формата IEEE с плавающей запятой.
Формат A: 1 знаковый бит, k=5 экспоненциальных бит, n = 3 дробных бита и смещение 15
Формат B: 1 знаковый бит, k=4 экспонентных бита, n = 4 дробных бита и смещение 7
Я предполагаю преобразовать формат A в формат B и использовать округление до + бесконечности. Пример проблемы, которую они дали:
Формат А
биты: 1 01111 001
значение: -9/8
Формат Б
биты: 1 0111 0010
значение: -9/8
Я полностью понимаю, как преобразовать двоичный файл в десятичную форму, но я полностью потерян на том, как они преобразовали 1 01111 001 в 1 0111 0010.
Любая помощь будет потрясающей. Спасибо!
1 ответ
Биты экспоненты являются основным фокусом при переключении, потому что вам нужно конвертировать, используя разные смещения для каждого формата. Итак, глядя на пример, который вам дали:
ФОРМАТ А имеет смещение 15 и двоичное значение показателя степени 15 (01111), поэтому вы принимаете двоичное значение - смещение, как если бы вы пытались получить значение IEEE; следовательно, давая вам ноль. При вычислении значения IEEE ваше уравнение выглядит так:
2 ^ 0 * 1,001. 1.001 в 1 раз больше вашего значения дробных битов.
Теперь мы конвертируем в FORMAT B.
ФОРМАТ B имеет 4 экспонентных бита. Итак, мы берем показатель степени вашего уравнения, который равен 0, и используем смещение B, чтобы найти, какой должна быть ваша цепочка битов.
значение битовой строки - смещение = показатель степени в уравнении. Это похоже на нахождение показателя степени при нахождении значения IEEE битовой строки.
значение битовой строки = 0 + смещение = 0 + 7, поскольку B смещение равно 7.
Следовательно, нам нужно значение битовой строки 7: 0111.
Объединяя то, что мы имеем до сих пор, мы получаем: 0 (бит знака), 0111 (биты экспоненты), 001 (биты дробной части) == 0 0111 001.
Теперь мы должны получить дробную битовую строку длины 4 для FORMAT B. У нас есть 001, и нам нужно добавить какой-нибудь бит в строку с последней цифрой, чтобы у нас было что-то в форме 001_, где _ представляет добавленный новый бит. Поскольку вы хотите, чтобы точность была как можно ближе к исходному формату, вы устанавливаете его равным 0. НИКОГДА не делайте его равным 1, поскольку это приводит к увеличению дробной битовой строки в 2 раза, что приводит к снижению точности.
Теперь мы объединяем все вместе, чтобы получить: 0 0111 0010, который является окончательным ответом примера.
Поэтому при конвертации между различными форматами вам нужно помнить два простых правила:
Если вы добавляете биты: 3 -> 4 дробных бита, к концу добавляются нули, чтобы сделать битовую строку нужной вам длины.
Если вы "удаляете" биты: 4 -> 3 дробных бита, самый правый (наименее значимый) бит теряется. Таким образом, 0111 -> 011(1), где (1) - "удаленный бит".