Понимание показателей степени 00000000 и 11111111 в IEEE - PullRequest
0 голосов
/ 03 сентября 2018

Я не могу разобраться с этими показателями:

  • Почему показатель степени 0000 0000 = -126 вместо -127 (т. Е. 0 - 127)?
    • Каково точное значение показателя степени 1111 1111?
    • Почему 0 1111 1111 0000 0000 0000 0000 0000 000 равняется бесконечности?

Я очень новичок во всем этом, поэтому, пожалуйста, объясните простым языком! Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Почему показатель степени 0000 0000 = -126 вместо -127 (т.е. 0 - 127)?

Для большинства нормальных показателей, когда мы достигаем нижней части диапазона значений и значений, мы спускаемся к следующему показателю. Например, числа от 1 (включительно) до 2 (исключая) представлены в порядке убывания:

  • 1.11… 111 • 2 0 ,
  • 1.11… 110 • 2 0 ,
  • 1.11… 101 • 2 0 ,
  • 1.11… 100 • 2 0 ,
  • ...
  • 1,00… 011 • 2 0 ,
  • 1,00… 010 • 2 0 ,
  • 1,00… 001 • 2 0 ,
  • 1,00… 000 • 2 0 .

Затем при переходе к следующим младшим числам мы корректируем показатель степени, поэтому следующие младшие числа:

  • 1.11… 111 • 2 −1 ,
  • 1.11… 110 • 2 −1 ,
  • 1.11… 101 • 2 −1 ,
  • 1.11… 100 • 2 −1 ,
  • ...

Теперь, когда мы находимся на самом низком нормальном показателе, самые низкие числа в этом диапазоне:

  • 1,00… 011 • 2 −126 ,
  • 1,00… 010 • 2 −126 ,
  • 1,00… 001 • 2 −126 ,
  • 1,00… 000 • 2 −126 .

Для продолжения в этот момент было решено, что последним шагом будет изменение начального бита на 0 вместо 1. Здесь был выбор: числа с нулем в поле экспоненты могли бы продолжить последовательность, переходя к показателю −127, поэтому следующее представимое число будет 1.11… 111 • 2 −127 , или они могут придерживаться показателя −126, но изменить ведущий бит на 0 вместо 1.

Если бы схема продолжалась, то, например, 1.11… 111 • 2 −127 и 1.11… 110 • 2 −127 были бы представимыми числами, но их различие 0,00… 001 • 2 −127 = 1 • 2 −150 , не будет представимым. Таким образом, если бы x и y были этими числами, их вычисленная разница, x-y, должна была бы быть 0 из-за округления (при округлении до ближайшего представимого значения). Однако иногда люди пишут такой код:

if (x == y)
    Handle special case.
else
    Handle normal case with some calculation involving division by x-y.

Таким образом, продолжение паттерна экспоненты до −127 нарушит некоторый код и приведет к тому, что арифметика с плавающей точкой будет действовать нежелательным образом. Таким образом, был сделан выбор: разбить шаблон, сохранить показатель степени на уровне -126 и сделать начальный бит 0 вместо 1. Тогда следующие представимые числа:

  • 0,11… 111 • 2 −126 ,
  • 0,11… 110 • 2 −126 ,
  • 0,11… 101 • 2 −126 ,
  • 0,11… 100 • 2 −126 ,
  • ...
  • 0,00… 011 • 2 −126 ,
  • 0,00… 010 • 2 −126 ,
  • 0,00… 001 • 2 −126 ,
  • 0,00… 000 • 2 −126 .

Вы можете видеть, что мы хотим 0,11… 111 • 2 −126 сразу после 1,00… 000 • 2 −126 . Если бы вместо этого было 0,11… 111 • 2 −127 , был бы разрыв - это вдвое меньше необходимого.

Каково точное значение показателя степени 1111 1111?

Когда поле экспоненты равно 1111 1111, оно не представляет никакой числовой экспоненты для обычного формата с плавающей запятой. Это значение в поле экспоненты является кодом для специальных значений (бесконечность и NaN).

Почему 0 1111 1111 0000 0000 0000 0000 0000 000 равно бесконечности?

Нет математической причины для этого. Бесконечность не возникает из любой математики, выполненной на значении и показателе степени. Только что было решено, что поле экспоненты 1111 1111 будет представлять бесконечности и NaN, и что, когда поле значений и все нули, оно представляет бесконечности, а когда поле значений и не все нули, оно представляет NaN.

0 голосов
/ 03 сентября 2018

Экспонента смещения для поплавка одинарной точности равна 127. Это означает, что значение показателя 127 (1000 0000) оценивается как фактический показатель степени ноль, а значение показателя степени одного (0000 0001) оценивается в качестве фактического показателя -126.

Значения экспонент всех нулевых битов или всех однобитовых битов (0000 0000 или 1111 1111) не являются фактическими показателями, а вместо этого запускают поведение в особом случае. Показатель «все ноль» означает, что в мантиссе нет подразумеваемого начального бита; используется для ненормальных чисел . И показатель все-один используется, чтобы отметить, что значение является либо бесконечностью, либо отрицательной бесконечностью, либо NaN , в зависимости от знакового бита и битов мантиссы.

Для дальнейшего прочтения, Руководство с плавающей запятой дает хорошее объяснение в простых терминах, и, конечно, если вы действительно хотите мельчайших деталей, ничто не сравнится Бумага Гольдберга .

...