- •Система команд fpu
- •Задание.
- •Лабораторная работа № 8 Вычисления с использованием математического сопроцессора
- •Задание.
- •Лабораторная работа № 9 Представление данных в математическом сопроцессоре
- •Особые случаи
- •1. Неточный результат
- •2. Численное антипереполнение или исчезновение порядка
- •3. Денормализованный операнд
- •4. Деление на нуль
- •5. Численное переполнение
- •6. Недействительная операция
- •Задание.
- •Литература
4. Деление на нуль
Так как отдельно хранятся знак и модуль мантиссы, то и существуют два нуля +0 и -0, которые приводят к знаковым бесконечностям: + и -. Для обозначения бесконечности используется код 11…11 в поле порядка и 00…00 в поле мантиссы, то есть число, следующее за максимально возможным. Сопроцессоры i8087 и i80287 имели два режима управления бесконечностью: проективный и аффинный. Сейчас используется только аффинный режим, в котором два нуля и две бесконечности:
В этом режиме:
Сравнение производится корректно во всем диапазоне чисел по формуле - < x < +.
Разрешено сложение бесконечностей с одинаковым знаком.
5. Численное переполнение
Возникает в том случае, если результат слишком велик по абсолютной величине, например 1000! Хотя результат зависит от режима округления, но при округлении по правилам арифметики устанавливается бесконечность. Результаты для разных режимов округления приведены в табл. 9.2.
Таблица 9.2. Специальные значения переполнения.
Режим округления |
Знак истинного результата |
Результат |
К ближайшему |
+ |
+∞ |
- |
-∞ |
|
К -∞ |
+ |
Наибольшее положительное число |
- |
-∞ |
|
К +∞ |
+ |
+∞ |
- |
Наибольшее отрицательное число |
|
К нулю |
+ |
Наибольшее положительное число |
- |
Наибольшее отрицательное число |
6. Недействительная операция
Включает все ситуации, не выявленные предыдущими особыми случаями.
Возможно получение двух результатов: либо неопределенности, либо нечисла (NAN – Not A Number), которые в свою очередь делятся на сигнализирующие (Signaling NAN) и «тихие» нечисла (Quiet NAN). В любом случае поле порядка таких значений содержит все единицы.
Если выполняется одна из следующих операций:
сложение бесконечностей с разными знаками или вычитание с одинаковыми;
умножение бесконечности на 0;
деление ∞ на ∞ или 0 на 0;
вычисление квадратного корня с отрицательным операндом;
команды тригонометрических функций, когда аргумент – бесконечность;
команда обмена, когда один или оба регистра пустые,
но операндов нечисел нет, то результат – неопределенность: отрицательное число, мантисса которой равна 10…00.
Неопределенность получается и при особом случае стека, а что произошло, можно различить по флагу С1: 1 – переполнение стека, 0 – антипереполнение. Это значение записывается в регистр-получатель, замещая первоначальное содержимое, указатель стека ТОР при этом не изменяется.
При сохранении в памяти числа как целого неопределенность кодируется как максимальное отрицательное число 10…00. Для десятичных чисел в старшие два байта записываются единицы. Вещественная неопределенность является частным случаем «тихого» нечисла.
Сигнализирующие нечисла имеют нуль в старшем бите мантиссы, остальные биты произвольны, кроме всех нулей. FPU такие числа как результат не формирует, но распознает, когда они служат операндами. В итоге вызывается обработчик прерывания, или формируется «тихое» нечисло. Обычно программист использует сигнализирующие нечисла для вызова обработчика особого случая. Например, компилятор может использовать такие нечисла как неинициализированные переменные с указанием дополнительной информации в поле мантиссы.
«Тихие» нечисла имеют старшую единицу в поле мантиссы. При формировании особого значения из сигнализирующего нечисла заменяется только старший бит мантиссы, остальные разряды сохраняются. Если выполняется недействительная операция без участия нечисел, то результатом является неопределенность.
Существовавшие ранее псевдонечисла, псевдобесконечности, псевдоденормализованные и ненормализованные числа, начиная с сопроцессора 80387 не поддерживаются. Это было связано с окончательным формированием стандарта IEEE854.
Весь диапазон данных, которые использует сопроцессор, различается для разных форматов. Так как в формате расширенной точности старший бит мантиссы представлен явно, то в табл. 9.3 представлены только форматы для данных одинарной и двойной точности.
Таблица 9.3. Кодирование данных в форматах одинарной и двойной точности.
Класс |
Поля числа или значения |
||
Знак |
Порядок |
Мантисса |
|
ПОЛОЖИТЕЛЬНЫЕ |
|||
Нечисла |
|||
«Тихие» |
0 |
11…11 |
11…11÷10…00 |
Сигнализирующие |
0 |
11…11 |
01…11÷00…01 |
Бесконечность |
0 |
11…11 |
00…00 |
Вещественные числа |
|||
Нормализованные |
0 |
11…10÷00…01 |
11…11÷00…00 |
Денормализованные |
0 |
00…00 |
11…11÷00…01 |
Нуль |
0 |
00…00 |
00…00 |
ОТРИЦАТЕЛЬНЫЕ |
|||
Вещественные числа |
|||
Нуль |
1 |
00…00 |
00…00 |
Денормализованные |
1 |
00…00 |
00…01÷11…11 |
Нормализованные |
1 |
00…01÷11…10 |
00…00÷11…11 |
Нечисла |
|||
Бесконечность |
1 |
11…11 |
00…00 |
Сигнализирующие |
1 |
11…11 |
00…01÷01…11 |
Неопределенность |
1 |
11…11 |
10…00 |
«Тихие» |
1 |
11…11 |
10…01÷11…11 |
