Смещение двоичного формата для поплавка в Java - PullRequest
2 голосов
/ 29 июля 2011

когда я просматриваю страницу в Википедии для двоичного смещения , я не могу следовать следующему предложению:

Необычно, однако, вместо использования "избытка 2 ^ (n-1) «он использует« избыток 2 ^ (n-1) -1 », что означает, что инвертирование старшего (старшего) бита показателя степени не приведет к преобразованию показателя степени в правильную запись дополнения к двум.

Может кто-нибудь объяснить это подробно и привести несколько примеров?

1 Ответ

2 голосов
/ 29 июля 2011

Это диапазон показателей, который позволяет вам вычислять 1 / Float.MAX_VALUE и 1 / Float.MIN_NORMAL без перехода в ноль или бесконечность.Если бы был еще один отрицательный показатель и один меньший положительный показатель (со смещением 128), то 1 / Float.MIN_NORMAL был бы бесконечностью.


Показатель в плавающей точке смещен, а не простоекомплемент.

например, для double показатель 0 равен 11-битному значению для 1023 или 0b0111111111, -1 равен 1022 или 0b0111111110, +1 равен 1024 0b10000000000.

В двойном дополнении число будет 0 равно 0b00000000000, -1 равно 0b11111111111, а +1 равно 0b00000000001

Свойство использования смещения состоит в том, что максимальное значение равно половине возможногоколичество значений.т. е. для 11 битов диапазон составляет от -1023 до 1024 вместо от -1024 до 1023.

Другое свойство заключается в том, что число можно сравнивать, просто сравнивая целочисленные значения.

т.е.

long l1 = Double.doubleToRawLongBits(d1);
long l2 = Double.doubleToRawLongBits(d2);
if (l1 > l2) // like d1 > d2

Единственная разница заключается в обработке NaN и -0.0. Подход Double.compare (double, double) основан на этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...