Почему показатель степени 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.