Как выполнить округление до четного числа с плавающей запятой - PullRequest
19 голосов
/ 24 января 2012

Что касается IEEE-754 с плавающей запятой одинарной точности, как вы выполняете округление до ближайшего, где выполняется округление до ближайшей четной цифры в требуемой позиции (по умолчанию и, безусловно, наиболее распространенный режим)?

В основном у меня есть защитный бит, круглый бит и липкий бит.Поэтому, если мы объединяем их в вектор и называем его GRS, то применяются следующие правила:

  1. Если G = 0, округлить (ничего не делать)
  2. Если G = 1RS == 10 или RS == 01, округление в большую сторону (добавьте единицу к мантиссе)
  3. , если GSR = 111, округление до четного

Так что я не уверен, как выполнить раунддо ближайшегоЛюбая помощь с благодарностью.

Ответы [ 3 ]

32 голосов
/ 24 января 2012

Просто чтобы убедиться, что мы на одной странице, G - самый старший бит из трех, R - следующий, а S можно рассматривать как наименее значимый бит, потому что его значение частично представляет еще менее значимые биты, которые были усечены в расчетах. Эти три бита используются только при выполнении вычислений и не сохраняются в переменной с плавающей запятой до или после вычислений.

Это то, что вы должны сделать, чтобы округлить результат до ближайшего четного числа, используя G, R и S:

GRS - Действие
0xx - округлить вниз = ничего не делать (x означает любое значение бита, 0 или 1)
100 - это галстук : округлить в большую сторону, если бит мантиссы непосредственно перед G равен 1, иначе округлить вниз = ничего не делать
101 - округление вверх
110 - округление вверх
111 - округление вверх

Округление производится путем добавления 1 к мантиссе в позиции младшего бита мантиссы непосредственно перед G. Если мантисса переполнена (ее 23 младших значащих бита, которые вы сохраните, станут нулями), вы должны добавить 1 к показателю степени. Если показатель степени переполняется, вы устанавливаете число на + бесконечность или -infinity в зависимости от знака числа.

В случае галстука вы добавляете 1 к мантиссе, если мантисса нечетная, и ничего не добавляете, если она четная. Вот что делает результат округленным до ближайшего четного значения.

5 голосов
/ 08 июля 2013

Просто хотел добавить, что S бит не просто бит после GR бит.Если есть доступные биты после GRS битов, это фактически логический ИЛИ из них, включая S бит.Другими словами, если после GR битов есть какой-либо бит, равный 1 , то значение S будет равно 1 .

0 голосов
/ 07 ноября 2018

При округлении учитывайте следующее, если набор битов ниже точности, которую вы сохраняете:

  1. Если младший значащий бит, который вы сохраняете, равен 0, просто добавьте 0x7ff .... f к битам округления.
  2. Если младший значащий бит, который вы сохраняете, равен 1, просто добавьте 0x800 .... 0 к битам округления.

Я думаю, что это реализует желаемое поведение, выполняя только один тест.

...