6.3.4 シグナル

シグナルは、計算中に生じた様々なエラー条件を表現します。 各々のシグナルは一つのコンテキストフラグと一つのトラップイネーブラに 対応しています。

コンテキストフラグは、該当するエラー条件に遭遇するたびに加算されて ゆきます。演算後にフラグを調べれば、演算に関する情報 (例えば計算が厳密だったかどうか) がわかります。 フラグを調べたら、次の計算を始める前にフラグを全てクリアするように してください。

あるコンテキストのトラップイネーブラがあるシグナルに対してセット されている場合、該当するエラー条件が生じると Python の例外を送出 します。例えば、DivisionByZero が設定されていると、 エラー条件が生じた際に DivisionByZero 例外を送出します。

class Clamped
値の表現上の制限に沿わせるために指数部が変更されたことを通知します。

通常、クランプ (clamp) は、指数部がコンテキストにおける指数桁の制限値 Emin およびEmax を越えたなった場合に発生します。 可能な場合には、係数部にゼロを加えた表現に合わせて指数部を減らします。

class DecimalException
他のシグナルの基底クラスで、ArithmeticError の サブクラスです。

class DivisionByZero
有限値をゼロで除算したときのシグナルです。

除算やモジュロ除算、数を負の値で累乗した場合に起きることがあります。 このシグナルをトラップしない場合、演算結果は Infinity または -Infinity になり、その符号は演算に使った入力に基づいて決まります。

class Inexact
値の丸めによって演算結果から厳密さが失われたことを通知します。

このシグナルは値丸め操作中にゼロでない桁を無視した際に生じます。 演算結果は値丸め後の値です。シグナルのフラグやトラップは、 演算結果の厳密さが失われたことを検出するために使えるだけです。

class InvalidOperation
無効な演算が実行されたことを通知します。

ユーザが有意な演算結果にならないような操作を要求したことを示します。 このシグナルをトラップしない場合、NaN を返します。 このシグナルの発生原因として考えられるのは、以下のような状況です:

        Infinity - Infinity
        0 * Infinity
        Infinity / Infinity
        x % 0
        Infinity % x
        x._rescale( non-integer )
        sqrt(-x) and x > 0
        0 ** 0
        x ** (non-integer)
        x ** Infinity

class Overflow
数値オーバフローを示すシグナルです。

このシグナルは、値丸めを行った後の指数部が Emax より大きいことを 示します。シグナルをトラップしない場合、演算結果は値丸めのモードにより、 表現可能な最大の数値になるように内側へ引き込んで丸めを行った値か、 Infinity になるように外側に丸めた値のいずれかになります。 いずれの場合も、Inexact および Rounded が同時に シグナルされます。

class Rounded
情報が全く失われていない場合も含み、値丸めが起きたときのシグナルです。

このシグナルは、値丸めによって桁がなくなると常に発生します。 なくなった桁がゼロ (例えば5.00 を丸めて 5.0 になった場合) であってもです。このシグナルをトラップしなければ、 演算結果をそのまま返します。このシグナルは有効桁数の減少を検出 する際に使います。

class Subnormal
値丸めを行う前に指数部が Emin より小さかったことを示す シグナルです。

演算結果が微小である場合 (指数が小さすぎる場合) に発生します。 このシグナルをトラップしなければ、演算結果をそのまま返します。

class Underflow
演算結果が値丸めによってゼロになった場合に生じる数値アンダフローです。

演算結果が微小なため、値丸めによってゼロになった場合に発生します。 Inexact および Subnormal シグナルも同時に発生します。

これらのシグナルの階層構造をまとめると、以下の表のようになります:

    
    exceptions.ArithmeticError(exceptions.StandardError)
        DecimalException
            Clamped
            DivisionByZero(DecimalException, exceptions.ZeroDivisionError)
            Inexact
                Overflow(Inexact, Rounded)
                Underflow(Inexact, Rounded, Subnormal)
            InvalidOperation
            Rounded
            Subnormal

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。