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

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

во-первых, просто чтобы пересмотреть мое понимание того, что такое Денормализованный поплавок:

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

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

это звучит правильно? Что-нибудь еще?

Я читал, что:

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

каких-либо замечаний по это?

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

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

какие-либо комментарии по этому поводу?

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

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

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

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

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

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

1 ответов


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

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

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

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

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

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

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

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

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

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

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

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

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

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