Почему мы смещаем показатель числа с плавающей запятой?
Я пытаюсь склонить голову к этому представлению с двоичными числами с плавающей точкой, но я не мог найти, независимо от того, где я выгляжу, хороший ответ на вопрос.
Почему экспоненту предвзято?
Что не так с добрым старым надежным двухкомпонентным методом?
- Сплавленные многократные добавления и режимы округления по умолчанию
- Алгоритм преобразования двоичного кода IEEE 754 в строку?
- Почему NaN не равен NaN?
- Переносимость двоичной сериализации типа double / float в C ++
- Принудительное использование плавающей запятой в .NET?
Я попытался взглянуть на статью Википедии, посвященную теме, но все, что она говорит, это: «обычное представление для подписанных значений, сделает сравнение более сложным».
- Преобразование с плавающей запятой 32-бит в 16 бит
- Является ли математика с плавающей запятой в C #? Может ли так быть?
- Какой диапазон чисел может быть представлен в 16-, 32- и 64-битных системах IEEE-754?
- Как проверить, использует ли C ++-компилятор стандарт IEEE 754 с плавающей запятой
- самое большое целое число, которое может быть сохранено в двойном
- Каково обоснование для всех сравнений, возвращающих false для значений NaN IEEE754?
- Могут ли какие-либо процессоры реального мира не использовать IEEE 754?
- Двойная точность - десятичные разряды
Кодировки IEEE 754 имеют удобное свойство, что сравнение сравнения может быть выполнено между двумя положительными номерами, отличными от NaN, просто сравнивая соответствующие битовые строки лексикографически или эквивалентно, интерпретируя эти битовые строки как целые числа без знака и сравнивая эти целые числа. Это работает во всем диапазоне с плавающей запятой от +0,0 до + бесконечности (и тогда просто расширить распространение, чтобы принять во внимание). Так, например, в бинарном 64 формате IEEE 754, 1.1
кодируется как битовая строка (сначала msb)
0011111111110001100110011001100110011001100110011001100110011010
в то время как 0.01
кодируется как битовая строка
0011111110000100011110101110000101000111101011100001010001111011
который происходит лексикографически перед битовой строкой для 1.1
.
Чтобы это работать, числа с меньшими показателями должны сравниваться перед числами с большими показателями. Пристрастный экспонент делает эту работу, в то время как показатель, представленный в дополнении двух, сделает сравнение более значимым. Я считаю, что это то, к чему относится комментарий Википедии.
Другое наблюдение заключается в том, что при выбранной кодировке число с плавающей запятой +0.0
кодируется как битовая строка, состоящая целиком из нhive.
Я не помню специфику, но было некоторое желание, чтобы наивысший показатель был немного дальше от нуля, чем наименьший нормальный показатель. Это увеличивает число значений x, для которых как x, так и их обратные приблизительно являются представимыми. Например, с 64-битной двоичной плавающей точкой IEEE-754 нормальный диапазон экспоненциального диапазона составляет от -1022 до 1023. Это делает наибольшее конечное представимое значение чуть менее 2 1024 , поэтому интервал, для которого х и его взаимные оба являются приблизительно отображаемыми составляет почти от 2 -1024 до почти 2 1024 . (Числа на самом нижнем конце этого интервала являются субнормальными, поэтому некоторая точность теряется, но они все еще представлены.)
С представлением с двумя дополнениями значения экспоненты будут варьироваться от -1024 до 1023, и мы должны зарезервировать два из них для обработки нhive, субнормальных значений, бесконечностей и NaN. Это оставляет диапазон от -1023 до 1022. При этом интервал для x такой, что оба x и его обратные приблизительно представляются, составляют почти от 2 -1023 до 2 1023 . Таким образом, смещенная компоновка обеспечивает больший полезный диапазон значений.