Исключение переполнения может возникнуть всегда, когда округленный истинный результат превышает по значению наибольшее конечное число в принимающем формате. Исключение может произойти при выполнении большинства арифметических команд и некоторых команд перевода формата, а именно: 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 || | - | Наибольшее конечное || | | отрицательное число |+--------------------+------------------+-----------------------|| | | Наибольшее конечное || По направлению | + | положительное число || к нулю | - | Наибольшее конечное || | | отрицательное число |+---------------------------------------------------------------+