##
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