Jump to content

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

(Перенаправлено с постепенного опустошения )
На этой странице в целом описаны субнормальные числа. Подробную информацию о субнормальных и ненормальных числах 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 субнормальные числа представлены полем нулевой экспоненты с ненулевым полем мантиссы. [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 и FTZ Флаги целей, поддерживающих SSE, приведены ниже, но не поддерживаются широко. Известно, что он работает на Mac OS X как минимум с 2006 года. [12]

#include <fenv.h>
#pragma STDC FENV_ACCESS ON
// Sets DAZ and FTZ, clobbering other CSR settings.
// See https://opensource.apple.com/source/Libm/Libm-287.1/Source/Intel/, fenv.c and fenv.h.
fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV);
// fesetenv(FE_DFL_ENV) // Disable both, clobbering other CSR settings.

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

#include <xmmintrin.h>
_mm_setcsr(_mm_getcsr() | 0x0040);  // DAZ
_mm_setcsr(_mm_getcsr() | 0x8000);  // FTZ
_mm_setcsr(_mm_getcsr() | 0x8040);  // Both
_mm_setcsr(_mm_getcsr() & ~0x8040); // Disable both

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

// To enable DAZ
#include <pmmintrin.h>
_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
// To enable 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) | (mode))
#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 defined(__arm64__) || defined(__aarch64__)
    uint64_t fpcr;
    asm( "mrs %0,   fpcr" : "=r"( fpcr ));             //Load the FPCR register
    asm( "msr fpcr, %0"   :: "r"( fpcr | (1 << 24) )); //Set the 24th bit (FTZ) to 1
#endif

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

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Уильям Кахан. «Протокол собрания IEEE 754R, 2002 г.» . Архивировано из оригинала 15 октября 2016 года . Проверено 29 декабря 2013 г.
  2. ^ «Интервью со стариком, занимающимся плавающей запятой» . Калифорнийский университет, Беркли.
  3. ^ «Денормализованные числа» . Кальдера Интернэшнл . Проверено 11 октября 2023 г. (Обратите внимание, что в документации XenuOS используется denormal , а в IEEE 754 subnormal .)
  4. ^ Шварц, Э.М.; Шмуклер, М.; Сон Дао Чонг (июль 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 и float)» . Apple Inc. Архивировано из оригинала 15 января 2014 года . Проверено 24 января 2013 г.
  14. ^ «Руководство пользователя компилятора C++ для систем Linux*» . Интел.
  15. ^ «Регистры Aarch64» . Рука.

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

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

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 30f7f54878b9b0e242dd55f44f60813d__1716451800
URL1:https://arc.ask3.ru/arc/aa/30/3d/30f7f54878b9b0e242dd55f44f60813d.html
Заголовок, (Title) документа по адресу, URL1:
Subnormal number - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)