С плавающей точкой с половиной точности - PullRequest
0 голосов
/ 29 июня 2019

У меня есть небольшой вопрос о IEEE-754 с половинной точностью.

1) У меня есть следующее упражнение: 13,7625 должно быть записано в 16 битах (с половинной точностью)

, поэтомуЯ начал преобразовывать число из DEC в двоичное, и я получил это 13,7625 = 1101.1100001100 2

в целом, это будет 1.1011100001100 * 2³.

  • бит знака равен 0, поскольку число положительное.
  • Мантисса должна иметь десять битов = 101 110 0001
  • Экспонент должен иметь пять битов = смещение (15) + 3 = 18, таким образом, показатель степени равен 10010, и здесь возникает проблема.

Мой профессор дал нам решение, и, как я знаю, я правильно выполнил мантиссу и двоичное преобразование, но для экспоненты он утверждает, что это 19 = 10011, но я не понимаюЭто.может быть бейс 16?согласно Википедии - 15 для половинной точности.- 127 для одинарной точности.- 1032 для двойной точности.

Можете ли вы указать, что я сделал неправильно, пожалуйста?.

2) еще один вопрос, что будет смещением экспоненты, если мы имеем следующую ситуацию: 1 знаковый бит + 4 бита Мантиссы + 3 экспонентных бита.и почему?

спасибо.

1 Ответ

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

1) У меня есть следующее упражнение: 13,7625 должно быть записано в 16 битах (половина точности)

, поэтому я начал преобразовывать число из DEC в двоичное и получил это 13,7625 = 1101.11000011002

Ваше обращение в мантиссу правильное, как и ваш показатель. Смещение экспоненты для половинной точности составляет 15 https://en.wikipedia.org/wiki/Half-precision_floating-point_format

еще один вопрос, каким будет смещение показателя, если мы имеем следующую ситуацию: 1 знаковый бит + 4 бита Мантиссы + 3 бита экспоненты. и почему?

Правила для кодирования IEEE-754 FP таковы, что если показатель степени закодирован с помощью n битов, смещение составляет 2 n-1 -1. Это применяется для простой точности (8b / смещение 2 7 -1 = 127), двойной (11b / 2 10 -1 = 1023 смещения (а не 1032, есть небольшой опечатка в вопросе)) и т. д.
Для поля показателя в 3 бита это дает смещение 2 2 -1 = 3

Для вашей проблемы кодирования это даст код экспоненты 3 + 3 = 6 = 110. Для мантиссы это зависит от политики округления. если мантисса округляется до 0, мы можем закодировать 1.1011 (100001100), просто отбросив конечные биты, и окончательный код будет
0.110.1011.

Но ошибка округления немного превосходит 0,5 ULP (точнее 0,1000011 ULP), и чтобы минимизировать ее, 1.10111000011 следует округлить на 4 бита, добавив 1 к ULP.

  1.1011 
+      1
= 1.1100

и окончательный код будет 0,110.1100

...