Программная модель процессора IntelPentium (IA-32). Программная модель – Регистры. Прикладная модель CPU, страница 4

NaN делятся на 2 класса:

  • сигнализирующие      (Signaling NaN,   SNaN)
  • тихие                         (Quiet NaN,        QNaN)

Сигнализирующие нечисла (SNaN) содержат «0» в старшем разряде дробной части мантиссы, остальные биты мантиссы произвольные.

QNaN содержат «1» в старшем бите дробной части мантиссы. Частным случаем QNaN является неопределенность, представляемая в виде:

1……

 

Значения неопределенности используется как результат выполнения операции с недопустимыми операндами, если случай недействительной операции IE замаскирован.

Примерами таких случаев могут являться:

1)  сложение бесконечностей с разными знаками;

2)  вычитание бесконечностей с одинаковыми знаками;

3)  умножение бесконечностей на ноль;

4)  деление 0/0 или ∞/∞;

5)  извлечение квадратного корня из отрицательного числа (FSQRT);

6)  вычисление логарифма из отрицательного числа.


Структуры регистров состояния и управления

FPSR (SW – Status Word, слово состояния)

FPCR (CW – Control Word, слово управления)

6 младших бит SW используются для фиксирования особых случаев FPU. В аналогичных разрядах CW содержит биты масок для разрешения или запрещения прерывания по соответствующим причинам. Разрешающим значением маски является «0», запрещающим – «1».

Особые случаи FPU

1)  IE (Invalid operation Error) – недействительная операция.

Этот особый случай возникает в стековых или арифметических операциях.

SF (Stack Fault) – нарушение стека.

Предназначен для фиксирования ошибок при работе с регистровым стеком. Для уточнения вида особого случая при работе со стеком (когда IE = 1 и SF = 1) используется бит C1 кода условия (C3-C0).

Установка бита C1 свидетельствует о переполнении стека, попытка записи в непустой регистр, а сброс бита C1 – об антипереполнении стека, попытка извлечения операнда из пустого регистра.

Примеры возникновения особого случая IE в арифметических операциях приведены ранее (см. случаи формирования неопределенности в качестве результата операции).

2)  DE (Denormalized operand Error) – денормализованный операнд.

Этот особый случай фиксируется, если операнд команды FPU представляет собой денормализованное число.

Наличие денормализованных операндов ухудшает точность операций из-за потери большого числа младших битов мантиссы. В связи с этим в некоторых приложениях, требующих высокой точности измерений, следует избегать операций с денормализованными операндами. Как правило, этот особый случай маскируется, и вычисления продолжаются без выхода на прерывание. Анализ потери точности производится при получении окончательного результата.

Кроме того, как было отмечено ранее, при использовании денормализованного операнда из памяти в форматах ОТ/ДТ его преобразование во внутренний формат РТ приводит к нормализации.

3)  ZE – divide by Zero Error.

Возникает при попытке деления конечного ненулевого числа на ноль, что может иметь место непосредственно в команде деления FDIV или её многочисленных модификациях:

F(I)DIV(R)(P),             R – Reverse

В обратной операции операнды меняются местами, например:

FDIV   dst, src;   dst/src → dst

FDIVR dst, src;   src/dst → dst

Особый случай ZE может возникать при выполнении команд: FXTRACT, FYL2X, FYL2XP1.

Первая из команд EXTRACT – Exponent and Significant (выделение мантиссы и порядка).

Команда разделяет число с плавающей точкой на две составляющие: мантиссу и порядок. Мантисса представляется в регистре ST(0) в виде вещественного числа с тем же знаком, что и исходный операнд, и с порядком равным нулю. Порядок также представляется в виде вещественного числа со знаком без смещения в регистре ST(1).

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

Команда FXTRACT приводит к особому случаю ZE, если её операнд является нулем. Аналогичный случай имеет место при выполнении вторых двух команд вычисления логарифмов, которые вычисляют значения:

                 (I)

           (II)

4)  OE – Overflow Error.

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