ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.


игра скуби ду свет камера тайна прохождение.

 

Часть 17

Глава 16. Особые вычислительные ситуации
----------------------------------------------------------------
Кроме представления положительных и отрицательных чисел, форматы
числовых данных можно использовать и для описания некоторых
особых значений. Эти специальные значения дают дополнительную
гибкость, но большинству пользователей нет необходимости
понимать их, чтобы успешно пользоваться вычислительными
возможностями процессора i486. В этом разделе описаны особые
значения, которые могут всплыть в конкретных ситуациях, и
показано назначение каждого из них. Числовые исключения описаны
специально для тех, кто пишет обработчики исключений и кому
интересно исследовать пределы вычислительных возможностей
процессора i486.
Материал, изложенный в этом разделе, будет в основном интересен
программистам, занимающимся созданием обработчиков исключений.
Остальные читатели могут бегло пролистать этот раздел.
При обсуждении особых вычислительных ситуаций полезно различать
арифметические команды и неарифметические команды.
Неарифметические команды это те, которые не имеют операндов или
передают операнды без особых изменений. Арифметические
команды это те, которые производят значимые изменения своих
операндов. В Таблице 16-1 приведены определения этих двух
классов команд.
16.1 Особые числовые значения
----------------------------------------------------------------
Форматы числовых данных процессора i486 позволяют кодировать
множество особых значений в добавок к обыкновенным целочисленным
и вещественным данным, которые являются результатами нормальных
вычислений. Эти особые значения имеют некоторую значимость и
могут нести какую-либо информацию о вычислениях или операндах,
которые производят это значение. Ниже приведен список типов
особых значений:
- Денормальные вещественные числа
- Нули
- Положительная и отрицательная бесконечность
- NaN (не-число)
- Неопределенность
- Неподдерживаемые форматы
В следующем разделе объясняется происхождение и значимость
каждого из этих особых значений. На иллюстрациях от Таблицы 16-6
до Таблицы 16-9 в конце этого раздела показано, как каждое из
этих особых значений кодируется для каждого типа числовых
данных.
16.1.1 Денормальные вещественные числа
----------------------------------------------------------------
Обычно процессор i486 хранит ненулевые вещественные числа в
нормализованной форме с плавающей точкой. То есть, бит
(начальный) целой части мантиссы всегда есть единица. (Смотрите
Главу 15 о форматах операнда.) Этот бит явно хранится в
расширенном формате и неявно предполагается единицей (1) в
простом и двойном форматах. Так как начальные нули подавляются,
то нормализованный вид позволяет хранить максимальное число
значащих цифр в мантиссе данной ширины.
    Таблица 16-1. Арифметические и Неарифметические Команды
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і  Неарифметические Команды     і   Арифметические Команды      і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і                               і                               і
і    FABS                       і   F2XM1                       і
і    FCHS                       і   FADD (P)                    і
і    FCLEX                      і   FBLD                        і
і    FDECSTP                    і   FBSTP                       і
і    FFREE                      і   FCOMP(P)(P)                 і
і    FINCSTP                    і   FCOS                        і
і    FINIT                      і   FDIV(R)(P)                  і
і    FLD   (регистр-в-регистр)  і   FIADD                       і
і    FLD   (расширенный формат  і   FICOM(P)                    і
і           из памяти)          і   FIDIV(R)                    і
і    FLD   константа            і   FILD                        і
і    FLDCW                      і   FIMUL                       і
і    FLDENV                     і   FIST(P)                     і
і    FNOP                       і   FISUB(R)                    і
і    FRSTOR                     і   FLD     (перевод форматов)  і
і    FSAVE                      і   FMUL(P)                     і
і    FST(P) (регистр-в-регистр) і   FPATAN                      і
і    FSTP   (расширенный формат і   FPREM                       і
і            в память)          і   FPREM1                      і
і    FSTCW                      і   FPTAN                       і
і    FSTENV                     і   FRNDINT                     і
і    FSTSW                      і   FSCALE                      і
і    FWAIT                      і   FSIN                        і
і    FXAM                       і   FSINCOS                     і
і    FXCH                       і   FSQRT                       і
і                               і   FST(P)  (перевод форматов)  і
і                               і   FSUB(R)(P)                  і
і                               і   FTST                        і
і                               і   FUCOM(P)(P)                 і
і                               і   FXTRACT                     і
і                               і   FYL2X                       і
і                               і   FYL2XP1                     і
і                               і                               і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Когда величина числа становится близкой к нулю, то уже нельзя
использовать нормализованный вид с плавающей точкой для того,
чтобы выразить это значение точно. Термин "маленькое" будет
использоваться в дальнейшем для того, чтобы точно определить
значения, требующие особой обработки. Говорят, что число 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 этой главы
показано, как денормальные числа кодируются в каждом из
вещественных форматов данных.
            Таблица 16-2. Денормализованные Значения
ЪДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і          і Наименьш.Величина  і     Наибольшая Величина       і
і  Формат  ГДДДДДДДДДВДДДДДДДДДДЕДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДґ
і          і(Точная) і(Приблиз.)і    (Точная)     і  (Приблиз.) і
ГДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДґ
і Простая  і  -150   і   -46    і  -126    -150   і   -38       і
і точность і 2       і 10       і 2     - 2       і 10          і
і Двойная  і  -1075  і   -324   і  -1022   -1075  і   -308      і
і точность і 2       і 10       і 2     - 2       і 10          і
і Расши-   і  -16461 і   -4956  і  -16382  -16462 і   -4932     і
і ренный   і 2       і 10       і 2     - 2       і 10          і
АДДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДЩ
Процесс денормализации является причиной потери значимости, если
низшие по порядку биты сдвигаются в мантиссе направо. В худшем
случае все биты мантиссы истинного результата сдвигаются и
заменяются начальными нулями. В этом случае результатом
денормализации является истинный ноль и, если значение находится
в регистре, то оно помечается как ноль.
Денормальные значения часто встречаются в большинстве
приложений. Типичные отладочные алгоритмы генерируют
экстремально малые результаты в процессе оценки промежуточных
подвыражений. Конечный результат, как правило, является
приемлемой величиной для простого или двойного формата на
выходе. Если промежуточные результаты содержатся во временном
вещественном виде, как рекомендовано, то диапазон этого формата
не очень часто дает отрицательное переполнение. Денормальные
числа часто всплывают только тогда, когда программа генерирует
слишком много промежуточных результатов, так много, что они не
могут храниться в регистровом стеке или в переменных памяти
расширенного формата. Если ограничения хранения заставляют
использовать простой или двойной формат для промежуточных
вещественных чисел и при этом производится маленькое значение,
то может произойти отрицательное переполнение. При этом, если
оно маскированное, то может быть выдано денормальное число.
Когда денормальное число простого или двойного формата
используется как исходный операнд и маскируется исключительная
ситуация с денормальными числами, то устройство обработки
операций с плавающей точкой процессора i486 автоматически
нормализует число при его переводе в расширенный формат.
16.1.1.1 Денормальные числа и последовательное отрицательное
         переполнение
----------------------------------------------------------------
Арифметика с плавающей точкой не может выполнять все операции
точно для всех операндов. Когда результат не представим как
переменная с плавающей точкой, неизбежна аппроксимация. Для
того, чтобы оставить аппроксимацию математически управляемой,
аппаратная часть подчиняется стандартам точности, которые могут
моделироваться конкретными неравенствами вместо уравнений.
Давайте предположим, что
X <- Y @ Z    (где @ - некоторая операция)
представляет типичную операцию. При изначальном режиме
округления (округление до ближайшего), каждая операция
выполняется с абсолютной ошибкой не более чем половина разности
между двумя числами с плавающей точкой ближайшими к точным
результатам. Пусть x является значением, хранимым в переменной с
именем X в программе, y - переменной Y и z - переменной Z.
Обычно y и z будут отличаться суммарной ошибкой от желаемого
результата и от того, что было бы получено при отсутствии
ошибок. Для вычисления x мы предполагаем, что y и z яляются
наилучшей аппроксимацией и что мы будем вычислять x настолько,
насколько это возможно. Если выражение y@z представимо точно, то
мы ожидаем, что x=y@z, и это то, что мы получили для каждой
алгебраической операции на устройстве обработки операций с
плавающей точкой процессора i486 (то есть, когда выражение y@z
является одним из y+z, y-z, y*z, y/z, sqrt z). Но если выражение
y@z должно быть аппроксимировано, как обычно, то x должен
отличаться от y@z не более чем на половину разности между двумя
представимыми числами, которые покрывают выражение y@z. Эта
разность зависит от двух факторов:
1.  Как определена точность, с которой проводятся вычисления,
    либо битами управления точностью, либо форматом,
    используемым в памяти. На процессоре i486 точность бывает
    простая (24 значащие бита), двойная (53 значащих бита) и
    расширенная (64 значащих бита).
2.  Как близко значение выражения y@z к нулю. В этом отношении
    существование денормальных чисел на процессоре i486
    предоставляет определенное преимущество над системами,
    которые не допускают денормальные числа.
В любых системах чисел с плавающей точкой плотность представимых
чисел больше ближе к нулю, чем ближе к наибольшим представимым
величинам. Однако, машины, которые не используют денормальные
числа, страдают от огромной дыры между нулем и его ближайшими
соседями. На Рисунках 16-1 и 16-2 показано, что случается около
нуля в двух различных системах чисел с плавающей точкой.
На Рисунке 16-1 показана система чисел с плавающей точкой,
которая (подобно процессору i486) допускает денормальные числа.
Для упрощения показаны только неотрицательные числа и рисунок
иллюстрирует систему чисел, которая несет только четыре значащие
разряда вместо 24-х, 53-х или 64-х значащих разряда, которые
предлагает процессор i486.
Каждый плюс обозначает представимое четырьмя значащими битами
число, а длинная вертикальная черта обозначает степень 2. Минусы
обозначают числа, не представимые с этой точностью. Денормальные
числа лежат между 0 и ближайшей нормальной степенью 2. Они не
менее плотны чем оставшиеся ненулевые числа.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і                                                               і
і                                                               і
і 0+++++++і+++++++і-+-+-+-+-+-+-+-і---+---+---+---+---+---+.... і
і                                                             і
і АДДДДДДДЩ - - - - - - Нормальные числа - - - - - ->           і
і Денормальные                                                  і
і    числа                                                      і
і                                                               і
і                                                               і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рисунок 16-1. Система Чисел с Плавающей Точкой с Денормальными
              Значениями
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і                                                               і
і                                                               і
і 0       і+++++++і-+-+-+-+-+-+-+-і---+---+---+---+---+---+.... і
і                                                              і
і         А - - - - - - Нормальные числа - - - - - ->           і
і                                                               і
і                                                               і
і                                                               і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рисунок 16-2. Система Чисел с Плавающей Точкой без Денормальных
              Значений
На Рисунке 16-2 показана система чисел с плавающей точкой,
которая (в отличие от модуля обработки операций с плавающей
точкой процессора i486 или сопроцессора 387) не допускает
денормальные числа. Существует две большие дырки: одна на
положительной стороне от нуля (как показано), а другая на
отрицательной стороне от нуля (не показано). Пространство между
нулем и ближайшим соседом нуля отличается от пространства между
этим соседом и следующим большим числом с коэффициентом примерно
8.4 x 10**(6) для простого формата, 4.5 x 10**(15) для двойного
формата и 9.2 x 10**(18) для расширенного формата. Эти дырки
усложняют анализ ошибок.
Преимущество денормальных чисел бесспорно, при рассмотрении
того, что происходит в случае, когда маскируется исключение
отрицательного переполнения и значение выражения y@z попадает в
пространство между нулем и наименьшим нормальным значением.
Процессор i486 выдает ближайшее денормальное число. Этот процесс
может быть назван "последовательное отрицательное переполнение".
Действие не отличается от округления, которое может случиться,
когда значение выражения y@z попадает в нормальный диапазон.
С другой стороны, система, которая не имеет денормальных чисел,
возвращает как результат ноль - процесс, который может быть
намного более неточен, чем округление. Это действие может быть
названо "резкое переполнение". Модуль обработки операций с
плавающей точкой процессора i486 и математический сопроцессор
387 обрабатывают денормальные значения по другому, иначе, чем
математические сопроцессоры 8087/80287. Для детального
знакомства обратитесь к разделу 16.2.4.
16.1.2 Нули
----------------------------------------------------------------
Значение нуль в десятичном вещественном или целочисленном
формате может быть со знаком плюс или минус, тогда как знак
двоичного целого нуля всегда положительный. При вычислениях
значение нуля всегда ведет себя одинаково, несмотря на знак, и
обычно то, что ноль может быть со знаком, является очевидным для
программиста. При необходимости можно использовать команду FXAM
для того, чтобы определить знак нуля.
Либо программист может закодировать ноль, или он может быть
создан модулем обработки операций с плавающей точкой как
маскируемый ответ на исключение отрицательного переполнения.
Если ноль загружен или сгенерирован в регистре, то этот регистр
помечается как ноль. В Таблице 16-3 приведены результаты
команд, выполненных с нулевыми операндами, а также показано, как
может получиться ноль из ненулевых операндов.
          Таблица 16-3. Нулевые Операнды и Результаты
ЪДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДї
і    Команда       і      Операнды      і       Результат       і
ГДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і FLD,FBLD         і ё0                 і *0                    і
і FILD             і +0                 і +0                    і
і FST,FSTP,FRNDINT і ё0                 і *0                    і
і                  і +X                 і +0(1)                 і
і                  і -X                 і -0(1)                 і
і FBSTP            і ё0                 і *0                    і
і FIST,FISTP       і ё0                 і *0                    і
і                  і +X                 і +0(3)                 і
і                  і -X                 і -0(4)                 і
і FCHS             і +0                 і -0                    і
і                  і -0                 і +0                    і
і FABS             і ё0                 і +0                    і
і Сложение         і +0 плюс +0         і +0                    і
і                  і -0 плюс -0         і -0                    і
і                  і +0плюс-0, -0плюс+0 і ё0(2)                 і
і                  і -Xплюс+X, +Xплюс-X і ё0(2)                 і
і                  і ё0плюсёX, ёXплюсё0 і #X                    і
і                  і                    і                       і
і Вычитание        і +0 минус -0        і +0                    і
і                  і -0 минус +0        і -0                    і
і                  і +0 минус+0,-0 минусі ё0(2)                 і
і                  і -0                 і ё0(2)                 і
і                  і +X минус+X,-X минусі -#X                   і
і                  і -X                 і #X                    і
і                  і ё0 минус ёX        і                       і
і                  і ёX минус ё0        і                       і
і Умножение        і ё0 x ё0            і (+)0                  і
і                  і ё0 x ёX, ёX x ё0   і (+)0                  і
і                  і +X x +Y, -X x -Y   і +0(1)                 і
і                  і +X x -Y, -X x +Y   і -0(1)                 і
і Деление          і ё0 / ё0            і Недопустимая Операция і
і                  і ёX / ё0            і (+)oo (Деление на 0)  і
і                  і ёX / ёoo           і (+)0                  і
і                  і +0 / +X, -0 / -X   і +0                    і
і                  і +0 / -X, -0 / +X   і -0                    і
і                  і -X / -Y, +X / +Y   і +0(1)                 і
і                  і -X / +Y, +X / -Y   і -0(1)                 і
і FPREM, FPREM1    і ё0 rem ё0          і Недопустимая Операция і
і                  і ёX rem ё0          і Недопустимая Операция і
і                  і +0 rem ёX          і +0                    і
і                  і -0 rem ёX          і -0                    і
і                  і +X rem ёY          і +0 Y точно делит X    і
і                  і -X rem ёY          і -0 Y точно делит X    і
і FSQRT            і ё0                 і *0                    і
і Сравнение        і ё0 : +X            і ё0 < +X               і
і                  і ё0 : ё0            і ё0 = ё0               і
і                  і ё0 : -X            і ё0 > -X               і
і FTST             і ё0                 і ё0 = 0                і
і FXAM             і +0                 і C3=1;  C2=C1=C0=0     і
і                  і -0                 і C3=C1=1;  C2=C0=0     і
і FSCALE           і ё0 масштабир. -oo  і *0                    і
і                  і ё0 масштабир. +oo  і Недопустимая Операция і
і                  і ё0 масштабир. X    і *0                    і
і FXTRACT          і +0                 і ST=+0, ST(1)=-oo      і
і                  і -0                 і Деление на ноль       і
і                  і                    і ST=-0, ST(1)=-oo      і
і                  і                    і Деление на ноль       і
і FPTAN            і ё0                 і *0                    і
і FSIN (или резулт.і ё0                 і *0                    і
і  SIN из FSINCOS) і                    і                       і
і FCOS (или резулт.і ё0                 і +1                    і
і  COS из FSINCOS) і                    і                       і
і                  і                    і                       і
і FPATAN           і ё0 / +X            і *0                    і
і                  і +0 / -X            і *Пи                   і
і                  і ёX / ё0            і #Пи/2                 і
і                  і ё0 / +0            і *0                    і
і                  і ё0 / -0            і *Пи                   і
і                  і +oo / ё0           і +Пи/2                 і
і                  і -oo / ё0           і -Пи/2                 і
і                  і ё0 / +oo           і *0                    і
і                  і ё0 / -oo           і *Пи                   і
і F2XM1            і +0                 і +0                    і
і                  і -0                 і -0                    і
і FYL2X            і ёY x log(ё0)       і Деление на ноль       і
і                  і ё0 x log(ё0)       і Недопустимая Операция і
і FYL2XP1          і +Y x log(ё0+1)     і *0                    і
і                  і -Y x log(ё0+1)     і -*0                   і
і                  і                    і                       і
АДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДЩ
X и Y         ненулевые положительные операнды.
1             когда отрицательное переполнение денормализует
              результат до нуля.
2             знак, опрежделяемый режимом округления: + для
              округления до ближайшего, округления вверх или
              отсечения, - для округления вниз.
3             при 0 < X < 1 и если не установлен режим
              округления вверх.
4             при -1 < X < 0 и если не установлен режим
              округления вниз.
*             знак изначального нулевого операнда.
#             знак изначального операнда X.
-#            дополнение знака изначального операнда X.
(+)           исключающее ИЛИ знаков операндов
16.1.3 Бесконечность
----------------------------------------------------------------
Вещественные форматы поддерживают представление бесконечности со
знаком. Эти значения кодируются со смещенным порядком из всех
единиц и с мантиссой 100..00. Если бесконечность попадает в
регистр, то он помечается как особый.
Или программист может закодировать бесконечность, или она может
быть создана модулем обработки операций с плавающей точкой как
маскируемый ответ на исключение переполнения или деления на
ноль. Обратите внимание, что в зависимости от режима округления,
маскируемый ответ может повлечь за собой наибольшее допустимое
значение, представимое в принимающем формате, а не
бесконечность.
К бесконечностям можно приписывать знак, поэтому возможно
сравнение с бесконечностью. Бесконечность всегда
интерпретируется в афинном смысле, то есть -oo < (любое конечное
число) < +oo. Арифметические операции с бесконечностью всегда
точны и не дают исключительных ситуаций, за исключением
недопустимых операций, указанных в Таблице 16-4.
         Таблица 16-4. Бесконечные Операнды и Результат
ЪДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДї
і    Операция      і      Операнды      і       Результат       і
ГДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і FLD,FBLD         і ёoo                і *oo                   і
і FST,FSTP,FRNDINT і ёoo                і *oo                   і
і FCHS             і +oo                і -oo                   і
і                  і -oo                і +oo                   і
і FABS             і ёoo                і +oo                   і
і Сложение         і +oo плюс +oo       і +oo                   і
і                  і -oo плюс -oo       і -oo                   і
і                  і +oo плюс -oo       і Недопустимая Операция і
і                  і -oo плюс +oo       і Недопустимая Операция і
і                  і ёoo плюс ёX        і *oo                   і
і                  і ёX плюс ёoo        і *oo                   і
і Вычитание        і +oo минус -oo      і +oo                   і
і                  і -oo минус +oo      і -oo                   і
і                  і +oo минус +oo      і Недопустимая Операция і
і                  і -oo минус -oo      і Недопустимая Операция і
і                  і ёoo минус ёX       і *oo                   і
і                  і ёX минус ёoo       і -*oo                  і
і Умножение        і ёoo x ёoo          і (+)oo                 і
і                  і ёoo x ёY, ёY x ёoo і (+)oo                 і
і                  і +0 x ёoo, ёoo x ё0 і Недопустимая Операция і
і Деление          і ёoo / ёoo          і Недопустимая Операция і
і                  і ёoo / ёX           і (+)oo                 і
і                  і ёX / ёoo           і (+)0                  і
і                  і ёoo / ё0           і (+)oo                 і
і FPREM, FPREM1    і ёoo rem ёoo        і Недопустимая Операция і
і                  і ёoo rem ёX         і Недопустимая Операция і
і                  і ёX rem ёoo         і $X, Q = 0             і
і FSQRT            і -oo                і Недопустимая Операция і
і                  і +oo                і +oo                   і
і Сравнение        і +oo : +oo          і +oo = +oo             і
і                  і -oo : -oo          і -oo = -oo             і
і                  і +oo : -oo          і +oo > -oo             і
і                  і -oo : +oo          і -oo < +oo             і
і                  і +oo : ёX           і +oo > X               і
і                  і -oo : ёX           і -oo < X               і
і                  і ёX  : +oo          і X   < +oo             і
і                  і ёX  : -oo          і X   > -oo             і
і                  і +oo                і +oo > 0               і
і FTST             і -oo                і -oo < 0               і
і FSCALE           і ёoo масштабир. -oo і Недопустимая Операция і
і                  і ёoo масштабир. +oo і *oo                   і
і                  і ёoo масштабир. ёX  і *oo                   і
і                  і ё0  масштабир. -oo і ё0(1)                 і
і                  і ё0  масштабир. oo  і Недопустимая Операция і
і                  і ёY  масштабир. +oo і #oo                   і
і                  і ёY  масштабир. -oo і #0                    і
і FXTRACT          і ёoo                і ST=*oo, ST(1)=+oo     і
і FXAM             і +oo                і C0=C2=1;  C1=C3=0     і
і                  і -oo                і C0=C1=C2=1;  C3=0     і
і                  і                    і                       і
і FPATAN           і ёoo / ёX           і *Пи/2                 і
і                  і ёY  / +oo          і #0                    і
і                  і ёY / -oo           і #Пи                   і
і                  і ёoo / +oo          і *Пи/4                 і
і                  і ёoo / -oo          і *3Пи/4                і
і                  і ёoo / ё0           і *Пи/2                 і
і                  і +0  / +oo          і +0                    і
і                  і +0  / -oo          і +Пи                   і
і                  і -0  / +oo          і -0                    і
і                  і -0  / -oo          і -Пи                   і
і F2XM1            і +oo                і +oo                   і
і                  і -oo                і -1                    і
і FYL2X            і ёoo x log(1)       і Недопустимая Операция і
і                  і ёoo x log(X>1)     і *oo                   і
і                  і ёoo x log(00)     і *oo                   і
і                  і ёoo x log(-1            >            >             і
і                    R1 <         R2 <         R3 <             і
і                       >            >            >             і
і                       і            і            і             і
і                       і            і            і             і
і           ДДДДДДДДДДДДБДДДДДДДДДДДДБДДДДДДДДДДДДЩ             і
і                                                               і
і                                             1                 і
і     ЭКВИВАЛЕНТНОЕ СОПРОТИВЛЕНИЕ = ДДДДДДДДДДДДДДДДДДДДД       і
і                                     1       1       1         і
і                                   ДДДДД + ДДДДД + ДДДДД       і
і                                     R1      R2      R3        і
і                                                               і
і                                                    240486/101 і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рисунок 16-3. Арифметический Пример Использования Бесконечности
Флаги исключений в слове состояния модуля обработки операций с
плавающей точкой предоставляют собой совокупную запись
исключений, которые произошли с того времени, когда эти флаги
были последний раз очищены. Установленные флаги можно очистить,
только выполнив команду FCLEX (сброс исключений),
переиницианализировав модуль обработки операций с плавающей
точкой или переписав флаги с помощью команд FRSTOR или FLDENV.
Это позволяет программисту маскировать все исключения, запустить
вычисления и затем проверить слово состояния для того, чтобы
посмотреть, была ли обнаружена какое-нибудь исключение в
какой-либо точке вычислений.
16.2.1.2 Программная обработка исключений
----------------------------------------------------------------
Если модуль обработки операций с плавающей точкой встречает
немаскированное условие исключения, то немедленно вызывается
программный обработчик исключений перед тем как выполнить
следующую команду WAIT или не управляющую команду с плавающей
точкой. В зависимости от значения бита NE управляющего регистра
CR0, обработчик исключений вызывается либо через вектор
прерывания 16, либо через внешнее прерывание.
Если NE = 1, то немаскированное исключение с плавающей точкой
обрабатывается через прерывание 16 непосредственно перед
выполнением следующей команды WAIT или не управляющей команды с
плавающей точкой. Прерывание 16 является вызовом операционной
системы, которое в свою очередь вызывает обработчик
исключения. В Главе 9 приведены общие соображения
относительно исключений и прерываний процессора i486.
Если NE = 0 (и ввод IGNNE# не является активным), то
немаскированное исключение с плавающей точкой замораживает
процессор непосредственно перед выполнением следующей
не управляющей команды с плавающей точкой или команды WAIT.
Замороженный процессор ожидает внешнее прерывание, которое
должно исходить от внешнего аппаратного обеспечения в ответ на
вывод FERR# процессора. (Вне зависимости от значения NE,
причиной активности вывода FERR# является немаскированное
числовое исключение.) В этом случае внешнее прерывание вызывает
процедуру обработки исключения. Если NE = 0, но активен ввод
IGNNE#, процессор не обращает внимания на исключение и
продолжает работу. Ошибка, проходящая через внешнее прерывание,
поддерживается только для совместимости с DOS. В Главе 25
приведено дальнейшее обсуждение подобной совместимости.
Процедура обработки исключений является обычно частью
программного обеспечения систем. Типичные ответы на
исключения включают:
- Увеличение на единицу счетчика исключений для дальнейшего
  вывода на экран или принтер.
- Печать или вывод на экран диагностической информации (то есть
  текущее состояние модуля обработки операций с плавающей точкой
  и регистров).
- Прекращение дальнейшего выполнения или использование
  указателей исключений для того, чтобы сделать команду, которая
  будет работать без генерации исключений, и ее выполнение.
Прикладным программистам следует обратиться к справочному
руководству по операционной системе для получения информации о
соответствующих ответах системы на числовые исключения. Для
системных программистов в Главе 19 приводятся некоторые детали
написания программных обработчиков исключений.
16.2.2 Недопустимые операции
----------------------------------------------------------------
Исключение может возникнуть в ответ на следующие два общих
класса операций:
1.  Операции со стеком
2.  Арифметические операции
Флаг стека (SF) слова состояния указывает, какой класс операций
вызвал исключительную ситуацию. Если SF = 1, то операция со
стеком привела к переполнению или отрицательному переполнению.
Если SF = 0, то арифметическая команда встретила недопустимый
операнд.
16.2.2.1 Исключение по стеку
----------------------------------------------------------------
Если SF = 1, указывая на стековую операцию, то бит O/U# кода
условия (бит C1) может показывать, что произошло - переполнение
или отрицательное переполнение стека:
O/U# = 1   Переполнение стека - команда попыталась загрузить
           что-либо в непустой регистр стека.
O/U# = 0   Отрицательное переполнение стека - команда
           попыталась прочитать операнд из пустого регистра
           стека.
Если исключение недопустимой операции маскировано, модуль
обработки операций с плавающей точкой возвращает
неопределенность QNaN. Это значение переписывает принимающий
регистр, разрушая его предыдущее содержание.
Если исключение недопустимой операции не маскировано, то
вызывается обработчик исключений. При этом вершина стека TOP не
изменяется и исходные операнды остаются нетронутыми.
16.2.2.2 Недопустимые арифметические операции
----------------------------------------------------------------
Этот класс включает в себя недопустимые операции, определенные в
стандарте IEEE 854. Модуль обработки операций с плавающей точкой
будет выдавать сообщение о недопустимой операции в любом из
перечисленных в Таблице 16-11 случаев. В этой таблице показаны
также ответы модуля обработки операций с плавающей точкой при
маскированном исключении недопустимой операции. Если
исключение не маскировано, то вызывается обработчик исключений
и операнды остаются неизмененными. Обычно недопустимая операция
указывает на ошибку в программе.
  Таблица 16-11. Маскированные Ответы на Недопустимые Операции
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і           Условие             і     Маскированный Ответ       і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і                               і                               і
і Любая арифметическая операция і Возвращает неопределенность   і
і над неподдерживаемым форматом.і типа QNaN.                    і
і                               і                               і
і Любая арифметическая операция і Возвращает QNaN (смотрите     і
і над сигнальным SNaN.          і раздел "Правила генерирования і
і                               і QNaN").                       і
і                               і                               і
і Операции сравнения и тестиро- і Устанавливает коды условия    і
і вания; один или оба операнда  і как "не сравнимы".            і
і являются типом NaN.           і                               і
і                               і                               і
і Сложение противоположных по   і Возвращает неопределенность   і
і знаку бесконечностей или      і типа QNaN.                    і
і вычитание бесконечностей с    і                               і
і одинаковым знаком.            і                               і
і                               і                               і
і Умножение: oo x 0 или 0 x oo. і Возвращает неопределенность   і
і                               і типа QNaN.                    і
і Деление: oo / oo или 0 / 0.   і Возвращает неопределенность   і
і                               і типа QNaN.                    і
і Команды взятия остатка        і Возвращает неопределенность   і
і FPREM, FPREM1, когда делитель і типа QNaN. Устанавливает      і
і равен 0 или делимое равно oo. і бит C2.                       і
і                               і                               і
і Тригонометрические команды    і Возвращает неопределенность   і
і FCOS, FPTAN, FSIN, FSINCOS,   і типа QNaN. Устанавливает      і
і когда аргумент равен oo.      і бит C2.                       і
і                               і                               і
і FSQRT над отрицательным опе-  і Возвращает неопределенность   і
і рандом (за исключением FSQRT  і типа QNaN.                    і
і (-0) = -0), FYL2X над отрица- і                               і
і тельным операндом (за исклю-  і                               і
і чением FYL2X (-0) = -oo),     і                               і
і FYL2XP1 над отрицательным     і                               і
і операндом, меньшим -1.        і                               і
і                               і                               і
і Команды FIST(P), когда ре-    і Сохраняет целочисленную       і
і гистр-источник пуст или содер-і неопределенность.             і
і жит NaN, oo, или выходит за   і                               і
і представимый диапазон приемни-і                               і
і ка.                           і                               і
і                               і                               і
і Команда FBSTP, когда регистр- і Сохраняет упакованную         і
і -источник пуст или содержит   і целочисленную неопределен-    і
і NaN, oo, или превышает 18     і ность.                        і
і десятичных цифр.              і                               і
і                               і                               і
і Команда FXCH, когда один или  і Заменяет пустые регистры на   і
і оба регистра помечены как     і неопределенность типа QNaN, а і
і пустые.                       і затем обрабатывает измененные і
і                               і регистры.                     і
і                               і                               і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
16.2.3 Деление на ноль
----------------------------------------------------------------
Если будет предпринята попытка разделить конечный ненулевой
операнд на ноль, модуль обработки операций с плавающей точкой
выдаст исключение деления на ноль. Это возможно при выполнении
команд F(I)DIV(R)(P), также как и при выполнении других
команд, которые имеют внутреннее деление: FYL2X и FXTRACT. Для
того, чтобы выдать бесконечность со знаком при помощи
исключающего ИЛИ знаков операндов, имеется маскированный ответ
на команды FDIV и FYL2X. Для команды FXTRACT регистр ST(1)
устанавливается на минус бесконечность, ST устанавливается на
ноль с тем же знаком, что и начальный операнд. Если
исключение деления на ноль не маскировано, вызывается
обработчик исключений и операнды остаются неизменными.
16.2.4 Денормальные операнды
----------------------------------------------------------------
Если арифметическая команда пытается оперировать денормальными
операндами, модуль обработки операций с плавающей точкой выдает
исключение с денормальными операндами. Денормальные операнды
могут иметь уменьшенную значимость из-за потери младших битов,
следовательно может быть желательно предотвратить операции над
этими операндами в некоторых конкретных программах. Это может
быть достигнуто с помощью обработчика исключений, который
реагирует на немаскированные исключения денормальных чисел.
Большинство пользователей будут маскировать эту исключение для
того, чтобы можно было выполнить вычисления. При этом
пользователь может проанализировать любые потери точности при
получении конечного результата.
Если это исключение маскировано, модуль обработки операций с
плавающей точкой устанавливает бит 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. Программа Обнаружения Сопроцессора
16.2.5 Числовые переполнения и числовые отрицательные
       переполнения
----------------------------------------------------------------
Если порядок числового результата слишком большой для
принимающего вещественного формата, то модуль обработки операций
с плавающей точкой выдает числовое переполнение. С другой
стороны, если порядок результата слишком мала для того, чтобы
быть представленой в принимающем формате, выдается отрицательное
числовое переполнение. Таким образом, если случается одно из
этих исключений, то это значит, что результат операции вышел за
рамки принимающего вещественного формата.
Большинство алгоритмов обычно производят особо большие и особо
малые числа при промежуточных вычислениях, а не в конечном
результате. Из-за большого диапазона расширенного вещественного
формата, переполнения и отрицательные переполнения являются
относительно редкими событиями в большинстве вычислительных
программных продуктов для процессора i486.
16.2.5.1 Переполнения
----------------------------------------------------------------
Исключение переполнения может возникнуть всегда, когда
округленный истинный результат превышает по значению наибольшее
конечное число в принимающем формате. Исключение может произойти
при выполнении большинства арифметических команд и некоторых
команд перевода формата, а именно: FST(P), F(I)ADD(P),
F(I)SUB(R)(P), F(I)MUL(P), FDIV(R)(P), FSCALE, FYL2X и FYL2XP1.
Ответ на условие переполнения зависит от того, маскировано ли
исключение переполнения:
- Исключение переполнения маскировано. Возвращаемое значение
  зависит от режима округления (смотрите Таблицу 16-12).
- Исключение переполнениния не маскировано. Немаскируемый ответ
  зависит от того, как предполагает команда сохранять результат
  - в стеке или в памяти:
  -  Если в стеке, то истинный результат делится на 2**(24576) и
     округляется. (Смещенный порядок 24576 равен 3 x 2**(13).)
     Мантисса округляется до требуемой точности (для тех
     команд, которые зависят от бита управления точностью (PC)
     управляющего слова, округление идет в зависимости от этого
     бита, в противном случае округляется до расширенной
     точности). При этом бит округления вверх (C1) слова
     состояния устанавливается, если мантисса была округлена с
     избытком.
     Уменьшение порядка числа на 24576 обычно приводит число
     насколько возможно ближе к середине диапазона порядка, так
     что, если это необходимо, его можно использовать в
     последовательных операциях масштабирования с наименьшим
     риском получить дальнейшие исключения. Однако при
     использовании команд FSCALE может случиться, что результат
     будет слишком большой, и произойдет переполнение даже после
     смещения порядка. В этом случае, немаскированный ответ
     является по существу тем же самым, что и маскированный
     округленный до ближайшего, а именно плюс/минус
     бесконечностью. Основная цель - гарантировать, что
     обработчик внутренних прерываний обнаружит, что уменьшение
     показателя на 24576 не приведет к корректной работе без
     определения программистом, который программирует
     показательные функции и процедуры перевода из десятичного в
     бинарный вид, какой обработчик внутренних прерываний
     следует вызвать, если их несколько.
  -  Если в памяти (это может случится только с командами
     сохранения), то никакие результаты в ней не сохраняются.
     Вместо этого, операнд остается нетронутым в стеке. Так как
     данные в стеке имеют формат расширенной точности,
     обработчик исключений либо заново выполняет команду
     сохранения после некоторых исправлений операнда, либо
     округляет мантиссу в стеке до точности принимающего
     формата, как требует стандарт. В конечном счете обработчик
     исключений должен сохранять значение в принимающем формате
     в памяти при продолжении программы.
     Таблица 16-12. Результаты Маскированного Переполнения
ЪДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДї
і       Режим        і  Знак Истинного  і      Результат        і
і     Округления     і    Результата    і                       і
ГДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і                    і                  і                       і
і До ближайшего      і        +         і +oo                   і
і                    і        -         і -oo                   і
і                    і                  і                       і
ГДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і                    і                  і Наибольшее конечное   і
і К -бесконечности   і        +         і положительное число   і
і                    і        -         і -oo                   і
і                    і                  і                       і
ГДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і                    і                  і                       і
і К +бесконечности   і        +         і +oo                   і
і                    і        -         і Наибольшее конечное   і
і                    і                  і отрицательное число   і
ГДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і                    і                  і Наибольшее конечное   і
і По направлению     і        +         і положительное число   і
і к нулю             і        -         і Наибольшее конечное   і
і                    і                  і отрицательное число   і
АДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДЩ
16.2.5.2 Отрицательные переполнения
----------------------------------------------------------------
Отрицательные переполнения могут возникнуть при выполнении
команд FST(P), FADD(P), FSUB(RP), FMUL(P), F(I)DIV(RP), FSCALE,
FPREM(1), FPTAN, FSIN, FCOS, FSINCOS, FPATAN, F2XM1, FYL2X и
FYL2XP1.
Два события могуть вызвать отрицательное переполнение:
1.  Получение маленького результата, который из-за того, что он
    слишком мал, может привести в дальнейшем к некоторым другим
    исключениям (таким, как переполнение при делении).
2.  Получение неточного результата; то есть полученный результат
    будет отличаться от того, который был бы вычислен при
    неограниченном диапазоне порядка и точности.
Какое из этих событий вызовет исключение отрицательного
переполнения зависит от того, маскировано ли исключение:
1. Исключение отрицательного переполнения маскировано.
   Исключение будет вызвана как при маленьком, так и при
   неточном результате.
2. Исключение отрицательного переполнения не маскировано.
   Исключение будет генерироваться при маленьком результате, не
   игнорироваться при неточности.
Ответ на исключение отрицательного переполнения также зависит от
того, маскировано ли исключение:
1.  Маскированный ответ. Результат является денормальным числом
    или нулем. Также генерируется исключение точности.
2.  Немаскированный ответ. Немаскируемый ответ зависит от того,
    как предполагает команда сохранять результат - в стеке или в
    памяти:
    - Если в стеке, то истинный результат умножается на
      2**(24576) и округляется. (Смещенный порядок 24576 равен 3
      x 2**(13).) Мантисса округляется до требуемой точности
      (для тех команд, которые зависят от бита управления
      точностью (PC) управляющего слова, округление идет в
      зависимости от этого бита, в противном случае округляется
      до расширенной точности). При этом бит округления вверх
      (C1) слова состояния устанавливается, если мантисса была
      округлена с избытком.
      Увеличение порядка числа на 24576 обычно приводит число
      насколько возможно ближе к середине диапазона порядка, так
      что, если это необходимо, его можно использовать в
      последовательных операциях масштабирования с наименьшим
      риском получить дальнейшие исключения. Однако, при
      использовании команды FSCALE может случиться, что
      результат будет слишком маленький, и произойдет
      отрицательное переполнение даже после смещения порядка. В
      этом случае, немаскированный ответ является по существу
      тем же самым, что и маскированный округленный до
      ближайшего, а именно плюс/минус нулем. Основная цель -
      гарантировать, что обработчик внутренних прерываний
      обнаружит, что увеличение показателя на 24576 не приведет
      к корректной работе без определения программистом, который
      программирует показательные функции и процедуры перевода
      из десятичного в бинарный вид, какой обработчик внутренних
      прерываний следует вызвать, если их несколько.
    - Если в памяти (это может случится только с командами
      сохранения), то никакие результаты в ней не сохраняются.
      Вместо этого, операнд остается нетронутым в стеке. Так как
      данные в стеке имеют формат расширенной точности,
      обработчик исключений либо заново выполняет команду
      сохранения после некоторых исправлений операнда, либо
      округляет мантиссу в стеке до точности принимающего
      формата, как требует стандарт. В конечном счете обработчик
      исключений должен сохранять значение в принимающем формате
      в памяти при продолжении программы.
16.2.6 Неточный результат (точность)
----------------------------------------------------------------
Это условие исключения возникает в случае, если результат
операции точно не представим в принимающем формате. Например,
дробь 1/3 нельзя точно представить в двоичной форме. Эта
исключение случается часто и указывает на то, что была несколько
потеряна точность (обычно приемлемо).
По своей природе трансцендентные команды часто являются причиной
возникновения исключений неточности результата.
Бит C1 (округление) слова состояния указывает на то, был ли
результат округлен вверх (C1 = 1) или отсечен (C1 = 0).
Когда происходит потеря точности, то исключению неточности
результа сопутствует исключение отрицательного переполнения.
Если отрицательное переполнение маскировано, то исключение
отрицательного переполнения генерируется только при потере
точности; следовательно также всегда устанавливается и флаг
точности. Если отрицательное переполнение немаскировано, то
может быть или может не быть потери точности; при этом бит
точности указывает, какой из этих случаев имел место.
Это исключение предназначено для прикладных программ, которым
необходимо выполнять только точную арифметику. Большинство
прикладных программ будут маскировать это исключение. Модуль
обработки операций с плавающей точкой передает округленный или
отрицательно переполненный результат в принимающий формат, не
обращая внимания на происходящее внутреннее прерывание.
16.2.7 Приоритетность исключений
----------------------------------------------------------------
Процессор i486 работает с исключениями в соответствии с
предопределенным приоритетом. Приоритеты в обработке
исключений означают, что выбирается исключение с более высоким
приоритетом и далее происходят действия в соответствии с
требованиями именно этого исключения. При этом исключения с
более низкими приоритетами могут и не отмечаться, даже если они
случаются. Например, деление сигнального SNaN на ноль приводит к
исключению недопустимого операнда (из-за SNaN), а не к
исключению деления на ноль; маскированным результатом будет
вещественная неопределенность вида QNaN, а не бесконечность.
Исключения денормальных чисел или неточности результа, однако,
могут генерироваться вместе с исключениями числового
переполнения или числового отрицательного переполнения.
Среди числовых исключений существуют следующие приоритеты:
1. Исключения недопустимой операции подразделяются в порядке
   приоритетов на:
    а.  Отрицательное переполнение стека.
    б.  Переполнение стека.
    в.  Операнд в неподдерживаемом формате.
    г.  Операнд типа SNaN.
2. Операнд типа QNaN. Хотя это и не является исключением, но
   если один операнд имеет тип QNaN, то работа с ним имеет
   приоритет выше, чем низкоприоритетные исключения. Например,
   деление операнда типа QNaN на ноль дает QNaN, а не
   исключение деления на ноль.
3. Все другие выше не упомянутые исключения недопустимых
   операций или деления на ноль.
4. Денормальный операнд. Если маскирован, то продолжается
   выполнение команды, и может иметь место низкоприоритетное
   исключение.
5. Числовое переполнение и числовое отрицательное переполнение.
   При этом может быть отмечен неточный результат.
6. Неточный результат (точность).
16.2.8 Стандартный обработчик исключений, связанных с
       переполнением/отрицательным переполнением
----------------------------------------------------------------
Пока исключения, связанные с переполнением или отрицательным
переполнением, маскированы, не требуется никакое дополнительное
программное обеспечение для того, чтобы обеспечить выходным
данным процессора i486 соответствие с требованиями стандарта
IEEE 854. Если немаскированы, то эти исключения дают обработчику
исключений дополнительные возможности в случае команд
сохранения. Никакие результаты не сохраняются в памяти, вместо
этого операнд остается нетронутым в стеке. Обработчик исключений
может округлить мантиссу операнда в стеке до точности
принимающего формата, как требует стандарт, или подправить
операнд и заново выполнить невыполненную команду.


Яндекс цитирования