Отрицательные переполнения могут возникнуть при выполнении команд FST(P), FADD(P), FSUB(RP), FMUL(P), F(I)DIV(RP), FSCALE, FPREM(1), FPTAN, FSIN, FCOS, FSINCOS, FPATAN, F2XM1, FYL2X и FYL2XP1.
Два события могуть вызвать отрицательное переполнение:
Получение маленького результата, который из-за того, что он слишком мал, может привести в дальнейшем к некоторым другим исключениям (таким, как переполнение при делении).
Получение неточного результата; то есть полученный результат будет отличаться от того, который был бы вычислен при неограниченном диапазоне порядка и точности.
Какое из этих событий вызовет исключение отрицательного переполнения зависит от того, маскировано ли исключение:
Исключение отрицательного переполнения маскировано. Исключение будет вызвана как при маленьком, так и при неточном результате.
Исключение отрицательного переполнения не маскировано. Исключение будет генерироваться при маленьком результате, не игнорироваться при неточности.
Ответ на исключение отрицательного переполнения также зависит от того, маскировано ли исключение:
Маскированный ответ. Результат является денормальным числом или нулем. Также генерируется исключение точности.
Немаскированный ответ. Немаскируемый ответ зависит от того, как предполагает команда сохранять результат - в стеке или в памяти:
Если в стеке, то истинный результат умножается на 2**(24576) и округляется. (Смещенный порядок 24576 равен 3 x 2**(13).) Мантисса округляется до требуемой точности (для тех команд, которые зависят от бита управления точностью (PC) управляющего слова, округление идет в зависимости от этого бита, в противном случае округляется до расширенной точности). При этом бит округления вверх (C1) слова состояния устанавливается, если мантисса была округлена с избытком.
Увеличение порядка числа на 24576 обычно приводит число насколько возможно ближе к середине диапазона порядка, так что, если это необходимо, его можно использовать в последовательных операциях масштабирования с наименьшим риском получить дальнейшие исключения. Однако, при использовании команды FSCALE может случиться, что результат будет слишком маленький, и произойдет отрицательное переполнение даже после смещения порядка. В этом случае, немаскированный ответ является по существу тем же самым, что и маскированный округленный до ближайшего, а именно плюс/минус нулем. Основная цель - гарантировать, что обработчик внутренних прерываний обнаружит, что увеличение показателя на 24576 не приведет к корректной работе без определения программистом, который программирует показательные функции и процедуры перевода из десятичного в бинарный вид, какой обработчик внутренних прерываний следует вызвать, если их несколько.
Если в памяти (это может случится только с командами сохранения), то никакие результаты в ней не сохраняются. Вместо этого, операнд остается нетронутым в стеке. Так как данные в стеке имеют формат расширенной точности, обработчик исключений либо заново выполняет команду сохранения после некоторых исправлений операнда, либо округляет мантиссу в стеке до точности принимающего формата, как требует стандарт. В конечном счете обработчик исключений должен сохранять значение в принимающем формате в памяти при продолжении программы.