Денормализованные числа

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Денормализованные числа (англ. denormalized numbers, subnormal numbers) — вид чисел с плавающей запятой, определенный в стандарте IEEE 754. При записи в форматах float, double, long double их экспонента будет записана как 0. Для получения их значения не требуется использование неявной единицы; мантисса просто умножается на наименьшую для данного формата экспоненту.

Денормализованные числа находятся ближе к 0, чем наименьшее представимое нормализованное число.

Предпосылки к появлению[править | править вики-текст]

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

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

Вопросы производительности[править | править вики-текст]

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

Примечания[править | править вики-текст]

  1. William Kahan. IEEE 754R meeting minutes, 2002. Проверено 1 декабря 2013.  (англ.)
  2. An Interview with the Old Man of Floating-Point. University of California, Berkeley.  (англ.)

Ссылки[править | править вики-текст]