Почему IEEE754 выбрал 11 битов степени для двойного или двоичного 64? - PullRequest
1 голос
/ 23 марта 2019

Я читал, и, похоже, IEEE 754 определяет 64-битный показатель с плавающей запятой (двойной) как 11 бит.(https://en.wikipedia.org/wiki/Double-precision_floating-point_format)

Мой вопрос: почему?

64-битное значение с плавающей запятой имеет значение 53 бита (первый бит, как предполагается, равен единице, поэтому только 52 бита)на самом деле хранятся) - так что вам нужно, чтобы показатель степени представлял по крайней мере число 53 (чтобы можно было переместить двоичную точку ось в любое место в значении), поэтому на данный момент вам нужно 7 бит.

Тогда вам также нужны отрицательные показатели, поэтому 8 бит.

Также вам нужны представления для 0, отрицательной и положительной бесконечности и NaN- (для них нужно 4 дополнительных представления), поэтому я предполагаю, что 10 бит.

Итак, мой вопрос: почему 11 показателей для показателя степени, а не 10 или 12, и как они будут определены для других длин чисел с плавающей запятой?

1 Ответ

3 голосов
/ 23 марта 2019

Связано: Почему в форматах с плавающей запятой с более высокой точностью столько битов экспоненты? о том, почему выбор дизайна был сделан именно таким образом.

Википедия https://en.wikipedia.org/wiki/Double-precision_floating-point_format отлично.

См. Также https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ Серия статей Брюса Доусона по ФП является важным чтением для среднего / продвинутого понимания ФП.

Также https://www.h -schmidt.net / FloatConverter / IEEE754.html отлично подходит для проверки битовых шаблонов.


Большинство ваших рассуждений о том, почему поле экспоненты имеет в качестве минимальной длины, неверны! Некоторые факторы, которые вы цитируете, являются разумным выбором дизайна для сценариев общего назначения. , но не требуется .

Выбор дизайна заключается в предоставлении большого динамического диапазона для обеспечения высокой точности в широком диапазоне чисел.

так что вам нужно, чтобы показатель степени представлял хотя бы число 53 (чтобы можно было переместить двоичную ось радиуса в любое место в значении), поэтому на данный момент вам нужно 7 бит.

Не правда. Не существует внутренней причины, по которой двоичный формат с плавающей точкой в ​​стиле IEEE754 должен поддерживать диапазон экспонент, достаточно большой, чтобы это произошло. Если большие числа не важны, вы можете выбрать так мало экспонентных битов, что даже при наибольшем показателе ближайшие представляемые значения будут ближе друг к другу, чем 1,0.

Кроме того, 6 битов дают вам 64 значения экспоненты, что достаточно, чтобы переместить двоичную точку за конец 53-битного значенияand.

Тогда вам также нужны отрицательные показатели, поэтому 8 бит.

Да, вполне разумно, чтобы ваш динамический диапазон был сосредоточен вокруг 1. Но для некоторых случаев, например, При обработке аудио вы можете использовать только числа с величинами от [0..1). Или может быть до 4, чтобы оставить место для больших временных значений.

В этом случае вы хотите выбрать смещение экспоненты, чтобы большинство значений экспоненты представляли отрицательные показатели.

Также вам нужны представления для 0, отрицательной и положительной бесконечности и NaN- (для этого нужно 4 дополнительных представления), поэтому я предполагаю, что 10 битов.

Нет, не требуется дополнительных битов флага, только одна из кодировок экспоненты, чтобы сигнализировать Inf / NaN в зависимости от значения. Так что для ваших гипотетических 8 битов экспоненты это уменьшит вас только от 256 до 255 возможных значений экспоненты для фактических чисел. например 2 ^ -127 до 2 ^ + 127 по-прежнему большой диапазон.

Максимальное (единичное) значение показателя степени означает Inf (значение = 0) или NaN (любое другое значение и значение), поэтому двоичный код IEEE 64 тратит 2x2 ^ 52-битных шаблона - 2 из его пространства кодирования 2 ^ 64 на полезные нагрузки NaN , Это не так полезно, как надеялись дизайнеры, и, возможно, лучше потратить их на постепенное переполнение, например, на то, как субнормальные значения допускают постепенное переполнение.

+-0.0 - это особый случай субнормальных чисел с минимальным значением показателя степени (закодированным как 0) и значениеми = 0. Смещенный показатель = 0 подразумевает ведущий 0 для значимого, а не обычно неявный 1. Другие значения и значения являются действительными числами, что позволяет постепенно снижаться. Этот особый случай убирает другое значение показателя из «нормальных» чисел.

Таким образом, 0.0 представляется все-нулевым битовым шаблоном, что очень удобно, поскольку память обычно инициализируется целочисленным нулем, и это позволяет обнулять массивы с помощью memset (который принимает только 1-байтовый шаблон а не 4 или 8-байтовый шаблон, который вам понадобится для инициализации массива с любым другим повторяющимся double)

...