Сигналы представляют условия, которые возникают во время вычислений. Каждый соответствует одному флагу контекста и одному активатору ловушки контекста.
Флаг контекста устанавливается всякий раз, когда встречается условие. После вычисления флаги могут быть проверены в информационных целях, например чтобы определить, было ли вычисление точным. После проверки флагов обязательно очистите все флаги перед началом следующего вычисления.
Если для сигнала установлен контекстный прерыватель ловушки, то условие вызывает исключение Python. Например, если ловушка установлена DivisionByZero
, то возникает исключение DivisionByZero
.
decimal
:exceptions.ArithmeticError(exceptions.Exception) DecimalException Clamped DivisionByZero(DecimalException, exceptions.ZeroDivisionError) Inexact Overflow(Inexact, Rounded) Underflow(Inexact, Rounded, Subnormal) InvalidOperation Rounded Subnormal FloatOperation(DecimalException, exceptions.TypeError)
decimal.Clamped
:Класс decimal.Clamped
сигнализирует об изменении показателя степени, чтобы соответствовать ограничениям представления.
Как правило, ограничение происходит, когда показатель степени выходит за пределы контекста Emin
и Emax
. Если возможно, показатель степени уменьшается, добавляя нули к коэффициенту.
decimal.DecimalException
:Базовый класс для других сигналов и подкласс исключения ArithmeticError
.
decimal.DivisionByZero
:Класс decimal.DivisionByZero
сигнализирует о делении бесконечного числа на ноль.
Может произойти с делением, делением по модулю или при увеличении числа до отрицательной степени. Если этот сигнал не захвачен, возвращает Infinity
или -Infinity
со знаком, определяемым входными данными для расчета.
decimal.Inexact
:Класс decimal.Inexact
указывает, что произошло округление и результат не является точным.
Сигнал происходит, когда ненулевые цифры отбрасывались во время округления. Округленный результат возвращается. Чтобы обнаружить, когда результаты являются неточными используются сигнальный флаг или ловушка.
decimal.InvalidOperation
:Класс decimal.InvalidOperation
указывает, что была выполнена недопустимая операция или операция которая не имеет смысла.
Возможные причины включают:
Infinity - Infinity 0 * Infinity Infinity / Infinity x % 0 Infinity % x sqrt(-x) and x > 0 0 ** 0 x ** (non-integer) x ** Infinity
decimal.Overflow
:Класс decimal.Overflow
указывает, на числовое переполнение.
Указывает, что показатель степени превышает Emax
после округления. Если не захвачен, то результат зависит от режима округления или уходит к наибольшему представимому конечному числу или округляя до Infinity
. В любом случае сигнализируются Inexact
и Rounded
.
decimal.Rounded
:Класс decimal.Rounded
указывает, что произошло округление, хотя, возможно, информация не была потеряна.
Сигнализируется всякий раз, когда округление сбрасывает цифры. Даже если эти цифры равны нулю, например округление от 5,00 до 5,0. Если не захвачен ловушкой trap
, возвращает результат без изменений. Этот сигнал используется для обнаружения потери значащих цифр.
decimal.Subnormal
:Класс decimal.Subnormal
указывает, что экспонента была ниже, чем Emin
до округления.
Происходит, когда результат операции является ненормальным, т. е. показатель степени слишком мал. Если не захвачен trap
, возвращает результат без изменений.
decimal.Underflow
:Класс decimal.Underflow
указывает, что произошло числовое занижение с результатом, округленным до нуля.
Происходит, когда субнормальный результат сводится к нулю округлением. Также сигнализируются decimal.Inexact
и decimal.Subnormal
.
decimal.FloatOperation
:Класс decimal.FloatOperation
включает более строгую семантику для смешивания чисел с плавающей точкой и десятичных дробей.
Если сигнал не захвачен (по умолчанию), то разрешено смешивание десятичных чисел Decimal
и float
в конструкторе decimal.Decimal()
, Context.create_decimal()
и всех операторах сравнения.
FloatOperation
в контекстных флагах. Decimal.from_float()
или Context.create_decimal_from_float()
флаг не устанавливают.В противном случае, когда сигнал захвачен в ловушку, только сравнения на равенство и явные преобразования не будут вызывать исключений. Все остальные смешанные операции вызывают FloatOperation
.