Почему значение frexp/ldexp находится в диапазоне от [0,5, 1,0)?

Почему функции frexp/ldexp имеют значение, которое находится в диапазоне от [0,5, 1,0), когда значения IEEE 745 на самом деле имеют значение, которое находится в диапазоне от [1,0, 2)?

1 ответ

Для любого действительного значения с плавающей запятой, которое не равно 0 или не является нормальным, старший бит мантиссы всегда равен 1. IEEE-754 использует это преимущество, не кодируя его в двоичном значении, тем самым выжимая один дополнительный бит точности. Подобно double, имеет 53 бита точности, но кодирует только 52. Таким образом, кодированное значение никогда не меньше 1, диапазон равен [1.0 .. 2)

Но как только требуется фактическое значение, например, когда вы его печатаете или выполняете вычисления, этот бит должен быть восстановлен из закодированного значения. Обычно выполняется внутри исполнительного блока процессора с плавающей запятой. В противном случае вдохновением стал печально известный 80-битный внутренний формат дизайна Intel x87 FPU. Таким образом, фактический диапазон составляет [0,5 .. 1). Функция frexp работает с фактическими значениями.

Другие вопросы по тегам