Обычно процессор i486 хранит ненулевые вещественные числа в нормализованной форме с плавающей точкой. То есть, бит (начальный) целой части мантиссы всегда есть единица. (Смотрите Главу 15 о форматах операнда.) Этот бит явно хранится в расширенном формате и неявно предполагается единицей (1) в простом и двойном форматах. Так как начальные нули подавляются, то нормализованный вид позволяет хранить максимальное число значащих цифр в мантиссе данной ширины.
Когда величина числа становится близкой к нулю, то уже нельзя использовать нормализованный вид с плавающей точкой для того, чтобы выразить это значение точно. Термин "маленькое" будет использоваться в дальнейшем для того, чтобы точно определить значения, требующие особой обработки. Говорят, что число R является маленьким, если -2**(Emin) < R < 0 или 0 < R < +2**(Emin). (Как определено в Главе 15, Emin равно -126 для простого формата, -1022 для двойного формата и -16382 для расширенного формата.) Другими словами, ненулевое значение является маленьким, если его порядок имеет слишком большую отрицательную величину для того, чтобы быть сохраненным в принимающем формате.
Для того, чтобы выходить из таких ситуаций, процессор i486 может хранить и оперировать денормализованными вещественными числами, то есть числами, мантиссы которых содержат один или более начальных нулей. Денормальные числа как правило возникают, когда в результате вычислений получается значение, являющееся маленьким.
Денормальные значения имеют следующие свойства:
Несмещенный порядок с плавающей точкой хранится в его наименьшем значении (ноль)
Целый бит мантиссы (явный или неявный) является нулем Начальные нули денормального значения позволяют представлять меньшие числа с некоторой приемлемой потерей точности (число значащих разрядов сокращается из-за начальных нулей). В стандартных алгоритмах такие маленькие значения в большинстве случаев генерируются как промежуточные, а не конечные результаты. Использование расширенного вещественного формата для хранения промежуточных значений гарантирует, что можно представить такие маленькие числа как └3.37 x 10**(-4932). Это делает случай с денормальными числами особым феноменом в вычислительных приложениях процессора i486. При этом процессор i486 может также загружать, хранить денормализованные вещественные числа и оперировать ими при появлении таких чисел.
Процессор i486 предпринимает некоторые действия, связанные с денормальными числами:
Процессор i486 избегает создания денормальных чисел всегда, когда это возможно. Другими словами, он всегда нормализует вещественное число, за исключением ситуации с маленькими числами.
Процессор i486 выдает немаскируемую исключение отрицательного переполнения для того, чтобы позволить программисту обнаружить случаи создания денормальных чисел.
Процессор i486 выдает исключение денормального числа для того, чтобы позволить пррограммисту обнаружить случаи, когда денормальные числа переходят в дальнейшие вычисления.
Денормализация означает увеличение порядка истинного результата и добавление соответствующих начальных нулей в мантиссу, сдвигая остаток мантиссы на одну позицию вправо. Денормальные значения могут всплывать в любом из форматов - простом, двойном или расширенном. В Таблице 16-2 показан диапазон денормализованных значений для каждого формата.
Денормализация производит либо денормальное значение, либо ноль. Денормальные числа легко определяются своими показателями, которые всегда минимальны для своих форматов. В форме со смещенным показателем это всегда битовая строка: 00...00. Такое же значение порядка приписывается нулям, но денормальные числа имеют ненулевую мантиссу. Денормальное число в регистре помечается как особое. В Таблицах 16-8 и 16-9 этой главы показано, как денормальные числа кодируются в каждом из вещественных форматов данных.
Процесс денормализации является причиной потери значимости, если низшие по порядку биты сдвигаются в мантиссе направо. В худшем случае все биты мантиссы истинного результата сдвигаются и заменяются начальными нулями. В этом случае результатом денормализации является истинный ноль и, если значение находится в регистре, то оно помечается как ноль.
Денормальные значения часто встречаются в большинстве приложений. Типичные отладочные алгоритмы генерируют экстремально малые результаты в процессе оценки промежуточных подвыражений. Конечный результат, как правило, является приемлемой величиной для простого или двойного формата на выходе. Если промежуточные результаты содержатся во временном вещественном виде, как рекомендовано, то диапазон этого формата не очень часто дает отрицательное переполнение. Денормальные числа часто всплывают только тогда, когда программа генерирует слишком много промежуточных результатов, так много, что они не могут храниться в регистровом стеке или в переменных памяти расширенного формата. Если ограничения хранения заставляют использовать простой или двойной формат для промежуточных вещественных чисел и при этом производится маленькое значение, то может произойти отрицательное переполнение. При этом, если оно маскированное, то может быть выдано денормальное число.
Когда денормальное число простого или двойного формата используется как исходный операнд и маскируется исключительная ситуация с денормальными числами, то устройство обработки операций с плавающей точкой процессора i486 автоматически нормализует число при его переводе в расширенный формат.