Если арифметическая команда пытается оперировать денормальными операндами, модуль обработки операций с плавающей точкой выдает исключение с денормальными операндами. Денормальные операнды могут иметь уменьшенную значимость из-за потери младших битов, следовательно может быть желательно предотвратить операции над этими операндами в некоторых конкретных программах. Это может быть достигнуто с помощью обработчика исключений, который реагирует на немаскированные исключения денормальных чисел. Большинство пользователей будут маскировать эту исключение для того, чтобы можно было выполнить вычисления. При этом пользователь может проанализировать любые потери точности при получении конечного результата. Если это исключение маскировано, модуль обработки операций с плавающей точкой устанавливает бит D в слове состояния, а затем выполняет команду. Последовательное отрицательное переполнение и денормальные числа при обработке на процессоре i486 будут выдавать хорошие результаты, и часто даже лучше, чем полученные на машинах, которые сводят отрицательные переполнения к нулю. Фактически, денормальные операнды в простом и двойном формате точности при загрузке в модуль обработки операций с плавающей точкой будут нормализованы и приведены к расширенному вещественному формату. При этом последовательные операции будут выигрывать от добавочной точности внутреннего вещественного расширенного формата.
Если это исключение не маскировано, будет установлен бит D и вызван обработчик исключений. При этом операнды не будут тронуты командой и могут быть использованы обработчиком для проверки.
Модуль обработки операций с плавающей точкой процессора i486 и математический сопроцессор 387 обрабатывают денормальные числа несколько иначе чем сопроцессоры 8087 и 80287. Эти изменения сделаны из-за пересмотра стандарта IEEE перед его внедрением. Различия в операциях проявляются при маскировании исключения денормальных чисел. Модуль обработки операций с плавающей точкой процессора i486 и математический сопроцессор 387 автоматически нормализуют денормальные числа. Сопроцессоры 8087 и 80287 выдают денормальный результат.
Различия в обработке денормальных чисел не лежат на виду. Исключения денормальных чисел обычно маскированы для сопроцессора 387 и модуля обработки операций с плавающей точкой процессора i486. Для программ, которые работают на математическом сопроцессоре 80287, исключения денормальных чисел часто не маскируются и необходимо вызывать обработчик исключений для того, чтобы нормализовать любые денормальные значения. Такого рода обработчики исключений являются излишними для процессора i486 и сопроцессора 387 DX - для них обработчик исключений денормальных чисел используется по умолчанию.
Программа может обнаружить эти ситуации и в процессе работы как на сопроцессоре 387 или модуле обработки операций с плавающей точкой процессора i486, так и на старых математических сопроцессорах 8087/80287. Для сопроцессоров 8087/80287 рекомендуется использовать последовательность кодов, приведенных на Рисунке 16-4. Этот пример на Рисунке 16-4 можно использовать для выборочного маскирования исключений денормальных чисел на процессоре i486 или сопроцессоре 387 DX. Для поддержки математических сопроцессоров 8087/80287 необходим обработчик исключений денормальных чисел. Этот пример программы может быть также использован для установки флага, который позволяет использовать новые команды, добавленные к основному набору команд сопроцессоров 8087/287 в устройствах обработки операций с плавающей точкой i486 и 387.
+---------------------------------------------------------------+| || || || FINIT ; Использовать режим бесконечности, || ; установленный по умолчанию: || ; компьютерный для сопроцессоров 8087/80287, || ; афинный для сопроцессора 387 DX и i486 FPU || FLD1 ; Генерировать бесконечность || FLDZ || FDIV || FLD ST ; Сформировать отрицательную бесконечность || FCHS || FCOMMP ; Сравнить +бесконечность с -бесконечностью || FSTSW temp ; Для сопроцессоров 8087/80287 они равны || MOV AX, temp || SAHF || JZ Using_8087 || || || |+---------------------------------------------------------------+ Рисунок 16-4. Программа Обнаружения Сопроцессора