Усечение с плавающей точкой против округления вручную - PullRequest
1 голос
/ 14 июня 2011

Я пытаюсь преобразовать десятичное число в целое число с плавающей запятой при использовании 32-разрядных регистров.Я должен сделать это вручную (карандаш и бумага), пока мой номер

1.11010110111100110100010011(base 2) x 2^26

Теперь я знаю, что мантисса может хранить только 2 ^ 23 укусов, поэтому мне нужно показать, как это будет выглядеть, используяокругление и без округления.Мой вопрос: что определяет округление?Я знаю, что усечение приведет к тому, что

1.11010110111100110100010(base 2) x 2^23

при округлении просто смотрит на бит вправо и округляет до 1, если он равен 1, и до 0, если он равен нулю?1008 * Что если число было

1.11010110111100110100010111(base 2) x 2^26 where there is a one to the right?

Что если бит в 2 ^ 3 был 1, а бит в 2 ^ 2 (справа) был 1, как в этом примере

1.11010110111100110100011111(base 2) x 2^26

Спасибо. Мне немного неясно, на каком этапе округления.

Ответы [ 2 ]

0 голосов
/ 16 июля 2011

Округление обычно выполняется до ближайшей более значимой цифры. Но если значение точно между ними, т. Е. Если старший бит, от которого вы хотите избавиться, равен 1, а остальные равны 0, существует несколько так называемых правил разрыва связи:

  • усечение (к 0)
  • вверх (к + бесконечность)
  • вниз (в направлении -infinity)
  • от 0
  • банковское округление (до ближайшего четного более значимого разряда).

Какое правило применяется, это то, что должно быть определено. AFAIK, большинство FPU по умолчанию используют банковское округление.

В нашем случае вы отбрасываете 3 двоичные цифры. 000 просто усекаются; 001-011 всегда округляется вниз; 101-111 всегда округляется вверх, а 100 вызывает правила разрыва связи. Если результатом этих правил является округление, вы добавляете один младший значащий бит к результату и, если необходимо, соответственно смещаетесь.

В первом случае вы просто усекаете биты, так как они меньше 100, но если это значение

1.11010110111100110100011111

и вы хотите удалить 3 бита, сначала оно усекается до

1.11010110111100110100011

но поскольку битов, которые вы выбросили, было 111, вы округлили, поэтому вы добавили 1 бит, и он стал

1.11010110111100110100100

IOW, младшие биты 011 становятся 100

0 голосов
/ 14 июня 2011

Усечение и округление двоичных чисел работают так же, как и для десятичных. Теоретически, вам нужно рассмотреть столько битов, сколько доступно, чтобы выполнить «правильное» округление, но на практике большинство аппаратных реализаций используют 1 или 2 бита вправо, чтобы определить, следует ли округлять.

...