Денормализованные числа - плавающая точка IEEE 754

Итак, я пытаюсь узнать больше о Denormalized числах, как определено в стандарте IEEE 754 для чисел с плавающей точкой. Я уже прочитал несколько статей благодаря результатам поиска Google, и я прошел несколько сообщений StackOverFlow. Однако у меня все еще остались без ответа.

Во-первых, просто для того, чтобы пересмотреть мое понимание того, что такое Denormalized float:

Числа, которые имеют меньше бит точности и меньше (в величина), чем нормированные числа

По существу, денормализованный float имеет возможность представлять наименьшее (по величине) число, которое может быть представлено любым значением с плавающей запятой.

Правильно ли это звучит? Что-нибудь еще для этого, чем это?

Я читал, что:

с использованием денормализованных номеров поставляется с высокой стоимостью для многих платформы

Любые комментарии по этому поводу?

Я также читал в одной из статей, которые

следует избегать перекрытия между нормализованными и денормализованными числами

Любые комментарии по этому поводу?

В некоторых презентациях стандарта IEEE, когда представлены диапазоны с плавающей точкой, денормализованные значения исключаются, а таблицы обозначаются как "эффективный диапазон", почти так, как если бы ведущий думал: "Мы знаем, что денормализованные числа CAN представляют наименьшие возможные значения с плавающей запятой, но из-за некоторых недостатков денормализованных чисел мы исключаем их из диапазонов, которые лучше подходят для сценариев общего использования". Как будто денормализованные числа обычно не используются.

Я полагаю, что у меня всегда создается впечатление, что использование денормализованных чисел в большинстве случаев оказывается не лучшим?

Если бы мне пришлось ответить на этот вопрос самостоятельно, я бы подумал, что:

Использование денормализованных чисел является хорошим, потому что вы можете представить наименьшие (по величине) числа, возможные - до тех пор, пока точность не важна, и вы не смешиваете их с нормализованными числами, И итоговая производительность приложения соответствует требования.

Использование денормализованных чисел - это плохо, потому что большинство приложений не требуют столь малых представлений. Точные потери вредны, и вы можете легко стрелять себе в ногу, смешивая их с нормализованными числами, И не соответствует стоит затрат в большинстве случаев.

Любые комментарии по этим двум ответам? Что еще я могу потерять или не понимать о денормализованных числах?

Ответ 1

По существу, денормализованный поплавок имеет возможность представлять МАЛЫЙ (по величине) номер, который можно представить с помощью любое значение с плавающей запятой.

Это правильно.

с использованием денормализованных номеров поставляется со стоимостью производительности на многих платформах.

На разных процессорах штраф отличается, но он может достигать двух порядков. Причина? То же, что и для этого совета:

следует избегать перекрытия между нормализованными и денормализованными числами

Здесь ключ: denormals - это "микроформат" с фиксированной точкой в ​​формате с плавающей запятой IEEE-754. В нормальных числах показатель показывает положение двоичной точки. Денормальные числа содержат последние 52 бита в нотации с фиксированной точкой с показателем 2 -1074 для удвоений.

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

Смешивание денормалов с нормалями происходит медленно, потому что вы смешиваете форматы, и у вас есть дополнительный шаг преобразования между ними.

Я думаю, что у меня всегда создается впечатление, что использование денормализованных цифры в большинстве случаев не очень хороши?

Денормалы были созданы для одной основной цели: постепенное переполнение. Это способ сохранить относительную разницу между маленькими числами. Если вы переходите от наименьшего нормального числа до нуля (резкое переполнение), относительное изменение бесконечно. Если вы перейдете к денормалам при недостаточном потоке, относительное изменение все еще не полностью точно, но, по крайней мере, более разумно. И эта разница проявляется в расчетах.

Иначе говоря. Числа с плавающей точкой равномерно распределены. Всегда существует одинаковое количество чисел между последовательными степенями двух: 2 52 (для двойной точности). Таким образом, без денормалов вы всегда получаете разрыв между 0 и наименьшим числом с плавающей запятой, который равен 2 52 раз размер разницы между наименьшими двумя числами. Денормалы равномерно заполняют этот зазор.

В качестве примера о влиянии резкого или постепенного нижнего потока рассмотрим математически эквивалентные x == y и x - y == 0. Если x и y являются крошечными, но разными, и вы используете резкое переполнение, тогда, если их разность меньше минимального значения отсечки, их разность будет равна нулю, и поэтому эквивалентность будет нарушена.

При постепенном переполнении разница между двумя крошечными, но разными нормальными числами становится денормальной, которая все еще не равна нулю. Эквивалентность сохраняется.

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