Денормальное число - Denormal number

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

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

В обычном значении с плавающей запятой нет ведущие нули в значимое; вместо этого, начальные нули удаляются путем корректировки степени (например, число 0,0123 будет записано как 1.23 × 10−2). Денормальные числа - это числа, в которых такое представление приведет к показателю степени ниже наименьшего представимого показателя степени (показатель степени обычно имеет ограниченный диапазон). Такие числа представлены с использованием ведущих нулей в мантиссе.

Значение (или мантисса) IEEE с плавающей точкой число - это часть числа с плавающей запятой, которое представляет значащие цифры. Для положительного нормализованного числа это может быть представлено как м0.м1м2м3...мп−2мп−1 (куда м представляет собой значащую цифру, а п это точность) с ненулевым м0. Обратите внимание, что для двоичного основание, ведущая двоичная цифра всегда равна 1. В денормальном числе, поскольку показатель степени является наименьшим из возможных, ноль является ведущей значащей цифрой (0.м1м2м3...мп−2мп−1), позволяя представлять числа ближе к нулю, чем наименьшее нормальное число. Число с плавающей запятой может быть признано денормальным, если его показатель степени является наименьшим возможным значением.

При заполнении пустого промежутка таким образом значимые цифры теряются, но не так резко, как при использовании сбросить до нуля при недостаточном количестве подход (отбрасывание всех значащих цифр при достижении потери значимости). Следовательно, производство денормального числа иногда называют постепенное истощение потому что это позволяет расчету медленно терять точность, когда результат невелик.

В IEEE 754-2008, денормальные числа переименовываются субнормальные числа и поддерживаются как в двоичном, так и в десятичном форматах. В двоичных форматах обмена субнормальные числа кодируются с помощью смещенная экспонента 0, но интерпретируются со значением наименьшего допустимого показателя степени, который на единицу больше (т. е. как если бы он был закодирован как 1). В десятичных форматах обмена они не требуют специального кодирования, потому что формат напрямую поддерживает ненормализованные числа.

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

Фон

Денормальные числа обеспечивают гарантию того, что при сложении и вычитании чисел с плавающей запятой никогда не будет потери значимости; два соседних числа с плавающей запятой всегда имеют представимую ненулевую разницу. Без постепенного истощения, вычитание а − б может оказаться недостаточным и привести к нулю, даже если значения не равны. Это, в свою очередь, может привести к деление на ноль ошибки, которые не могут возникнуть при использовании постепенного опустошения.[1]

Денормальные числа были реализованы в Intel 8087 пока писался стандарт IEEE 754. Они были, безусловно, самой противоречивой чертой Формат K-C-S предложение, которое в итоге было принято,[2] но эта реализация продемонстрировала, что денормальные значения могут поддерживаться в практической реализации. Некоторые реализации единицы с плавающей запятой не поддерживают напрямую ненормальные числа в оборудовании, а скорее ограничиваются какой-то программной поддержкой. Хотя это может быть прозрачно для пользователя, это может привести к тому, что вычисления, которые производят или используют денормальные числа, будут намного медленнее, чем аналогичные вычисления для нормальных чисел.

Проблемы с производительностью

Некоторые системы аппаратно обрабатывают денормальные значения так же, как и нормальные значения. Другие оставляют обработку денормальных значений системному программному обеспечению («помощь»), обрабатывая только нормальные значения и ноль на оборудовании. Обработка денормальных значений в программном обеспечении всегда приводит к значительному снижению производительности. Когда денормальные значения полностью вычисляются аппаратно, существуют методы реализации, позволяющие их обрабатывать со скоростью, сопоставимой с нормальными числами.[3] Однако скорость вычислений остается значительно сниженной на многих современных процессорах x86; в крайних случаях, инструкции с использованием денормальных операндов может работать в 100 раз медленнее.[4][5]

Эта разница в скорости может представлять угрозу безопасности. Исследователи показали, что он обеспечивает боковой канал синхронизации который позволяет вредоносному веб-сайту извлекать содержимое страницы с другого сайта в веб-браузере.[6]

Некоторые приложения должны содержать код, чтобы избежать ненормальных чисел, либо для поддержания точности, либо во избежание снижения производительности некоторых процессоров. Например, в приложениях для обработки звука денормальные значения обычно представляют настолько тихий сигнал, что он находится за пределами диапазона человеческого слуха. Из-за этого распространенной мерой, позволяющей избежать отклонений от нормы на процессорах, где может возникнуть снижение производительности, является обнуление сигнала, когда он достигает ненормального уровня, или смешивание с очень тихим шумовым сигналом.[7] Другие методы предотвращения денормальных чисел включают добавление смещения постоянного тока, квантование чисел, добавление сигнала Найквиста и т. Д.[8] Поскольку SSE2 расширение процессора, Intel предоставил такую ​​функциональность в аппаратном обеспечении ЦП, который округляет денормализованные числа до нуля.[9]

Отключение денормальных чисел с плавающей запятой на уровне кода

Intel SSE

Компиляторы Intel C и Fortran включают флаги денормального нуля (DAZ) и сброса в ноль (FTZ) для SSE по умолчанию для уровней оптимизации выше, чем -O0.[10] Эффект DAZ заключается в том, чтобы обрабатывать денормальные входные аргументы для операций с плавающей запятой как ноль, а эффект FTZ - возвращать ноль вместо денормального числа с плавающей запятой для операций, которые могут привести к денормальному счислению с плавающей запятой, даже если входные аргументы сами не являются денормальный. лязгать и gcc имеют различные состояния по умолчанию в зависимости от платформы и уровня оптимизации.

Не-C99 -Соответствующий метод включения флагов DAZ и FTZ на целях, поддерживающих SSE, приведен ниже, но широко не поддерживается. Известно, что над Mac OS X как минимум с 2006 года.[11]

#включают <fenv.h>#pragma STDC FENV_ACCESS ON// Устанавливает DAZ и FTZ, сбивая другие настройки CSR.// См. Https://opensource.apple.com/source/Libm/Libm-287.1/Source/Intel/, fenv.c и fenv.h.fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV);// fesetenv (FE_DFL_ENV) // Отключить оба, сбивая другие настройки CSR.

Для других платформ с набором инструкций SSE, где библиотека C еще не реализовала вышеуказанный флаг, может работать следующее:[12]

#включают <xmmintrin.h>_mm_setcsr(_mm_getcsr() | 0x0040);  // DAZ_mm_setcsr(_mm_getcsr() | 0x8000);  // ЗСТ_mm_setcsr(_mm_getcsr() | 0x8040);  // Обе_mm_setcsr(_mm_getcsr() & ~0x8040); // Отключить оба

В _MM_SET_DENORMALS_ZERO_MODE и _MM_SET_FLUSH_ZERO_MODE макросы оборачивают более читаемый интерфейс для кода выше.[13]

// Чтобы включить DAZ#включают <pmmintrin.h>_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);// Для включения ЗСТ#включают <xmmintrin.h>_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);

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

#define _MM_DENORMALS_ZERO_MASK 0x0040#define _MM_DENORMALS_ZERO_ON 0x0040#define _MM_DENORMALS_ZERO_OFF 0x0000#define _MM_SET_DENORMALS_ZERO_MODE (режим)             _mm_setcsr ((_ mm_getcsr () & ~ _MM_DENORMALS_ZERO_MASK) | (режим))#define _MM_GET_DENORMALS_ZERO_MODE ()             (_mm_getcsr () & _MM_DENORMALS_ZERO_MASK)

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

РУКА

AArch32 NEON (SIMD) FPU всегда использует режим сброса до нуля, который аналогичен FTZ + DAZ. Для скалярного FPU и в AArch64 SIMD поведение сброса в ноль является необязательным и управляется битом FZ регистра управления - FPSCR в Arm32 и FPCR в AArch64.

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

Смотрите также

Рекомендации

  1. ^ Уильям Кахан. «Протокол собрания IEEE 754R, 2002 г.». Архивировано из оригинал 15 октября 2016 г.. Получено 29 декабря 2013.
  2. ^ "Интервью со Стариком Плавающей точки". Калифорнийский университет в Беркли.
  3. ^ Schwarz, E.M .; Schmookler, M .; Сон Дао Чонг (июль 2005 г.). «Реализации FPU с денормализованными числами» (PDF). Транзакции IEEE на компьютерах. 54 (7): 825–836. Дои:10.1109 / TC.2005.118.
  4. ^ Дули, Исаак; Кале, Лакшмикант (12 сентября 2006 г.). «Количественная оценка помех, вызванных субнормальными значениями с плавающей запятой» (PDF). Получено 2010-11-30.
  5. ^ Туман, Агнер. «Таблицы инструкций: списки задержек инструкций, пропускной способности и сбоев микроопераций для процессоров Intel, AMD и VIA» (PDF). Получено 2011-01-25.
  6. ^ Андриско, Марк; Кольбреннер, Дэвид; Мауэри, Китон; Джала, Ранджит; Лернер, Сорин; Шахам, Ховав. «О ненормальной плавающей запятой и ненормальном времени» (PDF). Получено 2015-10-05.
  7. ^ Серрис, Джон (16 апреля 2002). «Денормализация Pentium 4: скачки производительности процессора в аудиоприложениях». Архивировано из оригинал 25 февраля 2012 г.. Получено 2015-04-29.
  8. ^ де Сорас, Лоран (19 апреля 2005 г.). «Денормальные числа в приложениях обработки сигналов с плавающей запятой» (PDF).
  9. ^ Кейси, Шон (2008-10-16). «x87 и SSE с плавающей запятой помогают в IA-32: Flush-To-Zero (FTZ) и Denormals-Are-Zero (DAZ)». Получено 2010-09-03.
  10. ^ «Библиотека Intel® MPI - Документация». Intel.
  11. ^ «Re: проблема производительности Macbook pro». Apple Inc. Архивировано с оригинал на 26.08.2016.
  12. ^ «Re: изменение состояния с плавающей запятой (было: двойное против производительности с плавающей запятой)». Apple Inc. Архивировано с оригинал на 2014-01-15. Получено 2013-01-24.
  13. ^ "Компилятор C ++ для Linux * Руководство пользователя систем". Intel.

дальнейшее чтение

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