Это очень простой вопрос, но для ответа нужен эксперт.
Как мы знаем, с субнормальным значением с плавающей запятой мы избавляемся от разрыва между 2^emin
и 0
.
В режиме округления от половины до четного (RTE) мы должны округлить результат с бесконечной точностью как (0.1111...1|r)*2^emin
или (1.1111...1|r')*2^(emin-1)
?Число слева от точки является неявным битом.
Для первого случая: В статье Что должен знать каждый компьютерщик об арифметических численных вычислениях с плавающей точкой , на рисунке 2 я вижу пространство слева от 2^emin
такое же, как пространство справа.Итак, прямо, числовое значение левого числа равно 2^emin - 2^(1-p)
(p=24
в flp32).Если мы делаем округление RTE, кажется, что мы должны использовать бит после 24-битного значащего в качестве бита округления (т. Е. (0.111_1111_1111_1111_1111_1111|r)*2^emin
, см.
--|---+---+....+-?-|---+---+....+---|-------+........
--0---------------2^emin---------2^emin+1
. Я использую знак вопроса (?
) на оси для представленияточка половины
Для второго случая: В стандарте IEEE для субнормального обнаружения перед округлением он говорит «неограниченный» показатель степени блабла. Поэтому, если у нас может быть неограниченный показатель степени, мы можем сдвинутьточный результат до (1.1111...1|r')*2^(emin-1)
. В этом случае у нас есть половинное левое пространство на 2^emin
. Это аналогично всем другим смежным пробелам на 2^e
, но после закрытия на 0 на оси числопробелы бесконечны. См.
--|...++++|-+-+-+...|---+---+....+-?-|-------+........
--0-....----------2^emin-1----------2^emin
------| here is keep shrinking
В этом случае кажется, что мы должны округлить точный результат как
(1.111_1111_1111_1111_1111_1111|r')*2^(emin-1)
Путем сдвига на 1 бит влево для результата 1, означает защитный битв этом случае полезен.
В этих двух случаях у нас разные биты округления, поэтому мы можем получить разные результаты. В каком случае мы должны следовать? Я не смог ясно увидеть какие-либо документы / доклады по этой теме.