stringtranslate.com

Субнормальное число

На этой странице в целом описаны субнормальные числа. Подробную информацию о субнормальных и ненормальных числах IEEE см. в разделе IEEE ниже.

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

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

Терминология

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

Термин «число» используется довольно широко для описания определенной последовательности цифр, а не математической абстракции; см. раздел «Плавающая точка» для получения подробной информации о том, как действительные числа связаны с представлениями с плавающей запятой. «Представление», а не «число», может использоваться, когда требуется ясность.

Определение

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

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

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

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

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

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

Фон

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

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

IEEE

В двоичных форматах с плавающей запятой IEEE субнормальные числа представлены полем нулевой экспоненты с ненулевым полем мантиссы. [3]

Никаких других денормализованных чисел не существует в двоичных форматах с плавающей запятой IEEE, но они существуют в некоторых других форматах, включая десятичные форматы с плавающей запятой IEEE.

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

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

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

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

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

Интел ССЕ

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

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

#include <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. 

Для других платформ x86-SSE, где библиотека C еще не реализовала этот флаг, может работать следующее: [13]

#include <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оборачивают более читаемый интерфейс приведенного выше кода. [14]

// Чтобы включить DAZ #include <pmmintrin.h> _MM_SET_DENORMALS_ZERO_MODE ( _MM_DENORMALS_ZERO_ON ); // Чтобы включить FTZ #include <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(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 и в SIMD AArch64 поведение сброса в ноль является необязательным и контролируется битом FZрегистра управления — FPSCR в Arm32 и FPCR в AArch64. [15]

Одним из способов сделать это может быть:

#if определено(__arm64__) || определено (__aarch64__) uint64_t fpcr ; asm ( "миссис %0, fpcr" : "=r" ( fpcr )); //Загружаем регистр asm FPCR ( "msr fpcr, %0" :: "r" ( fpcr | ( 1 << 24 ) )); //Устанавливаем 24-й бит (FTZ) в 1 #endif                    

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

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

Примечания

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

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

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