Обычное число

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

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

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

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

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

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

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

Содержание
  • 1 Предпосылки
  • 2 Проблемы с производительностью
  • 3 Отключение денормальных чисел с плавающей запятой на уровне кода
    • 3.1 Intel SSE
    • 3.2 ARM
  • 4 См. Также
  • 5 Ссылки
  • 6 Дополнительная литература
Предпосылки

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

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

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

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

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

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

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

Intel SSE

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

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

#include #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 еще не реализовала вышеуказанный флаг, может работать следующее:

#include _mm_setcsr (_mm_getcsr () | 0x0040); // DAZ _mm_setcsr (_mm_getcsr () | 0x8000); // FTZ _mm_setcsr (_mm_getcsr () | 0x8040); // Оба _mm_setcsr (_mm_getcsr () ~ 0x8040); // Отключить оба макроса

, _MM_SET_DENORMALS_ZERO_MODEи _MM_SET_FLUSH_ZERO_MODE, заключающие в оболочку более читаемый интерфейс для приведенного выше кода.

// Чтобы включить DAZ #include_ZER_ZERO_MENORM_SODE _MENORM_SET_MENORM_SOD_55>_MENORM_SOD_); // Чтобы включить FTZ #include _MM_SET_FLUSH_ZERO_MODE (_MM_FLUSH_ZERO_ON);

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

#define _MM_DENORMALS_ZERO_MASK 0x0040 #define _MM_DENORMALS_ZERO_ON 0x0040_DENORMALS_ZERO_ON 0x0040 mode) \ _mm_setcsr ((_ mm_getcsr () ~ _MM_DENORMALS_ZERO_MASK) | (mode)) #define _MM_GET_DENORMALS_ZERO_MODE () \ (_mm_getcsr () _MM_DENORMALS_ZERO_MODE () \ (_mm_getcsr () _MM_DENORMALS_ZERO_MASK) по умолчанию, поэтому поведение по умолчанию - и поэтому поведение по умолчанию - denO_M -Поведенное программное обеспечение должно сохранять и восстанавливать нормальный режим перед тем, как вернуться к вызывающему или вызвать ничего не подозревающий код библиотеки / ОС.

ARM

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

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

См. Также
Ссылки
Дополнительная литература

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

Последняя правка сделана 2021-05-17 13:33:19
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте