● 例外処理

floatex.dll では、演算がエラーになるとハードウエアの浮動小数点例外が発生します。floatex.dll からは関数 matherr を呼び出しません。エラー処理が必要な場合は、プログラム側がその例外をキャッチし、処理しなければなりません。

例外の種類

例外は、ステータスレジスタにフラグとしてセットされます。

例外の種類意味
無効操作例外(IE)無効な演算を行った時に発生します(算術命令に無効なオペランドを指定した時)。スタックフォルトが発生した時は、スタックフォルトフラグと一緒に、このフラグもセットされます。
デノーマライズド・オペランド例外(DE)デノーマル値を演算しようとした時に発生します(参照:「デノーマル数」)。また、32 bit 、64 bit 精度のデノーマル値をレジスタスタックにロードしようとした時にも発生します。
ゼロ除算例外(ZE)FPU がゼロ除算を行った時に発生します。算術的にゼロ除算を行った場合以外に、FPU が内部演算で行った除算でも発生する事があります。
オーバーフロー例外(OE)演算結果が、格納先の変数で表現できる範囲を超えた場合に発生します。
アンダーフロー例外(UE)演算結果がノーマル数よりも小さい場合(デノーマル数になった場合)に発生します。
不正確結果例外(PE)精度例外と呼ばれる事もあります。演算結果が、格納先の変数で正確に表現できない場合に発生します。
スタックフォルト(SF)演算処理が、8 本分以上のレジスタスタックを操作しようとした場合に発生します。このフラグがセットされる時は、無効操作例外もセットされます。
レジスタスタックに入り切らない量をプッシュした場合はスタックオーバーフローとなり、ステータスワードの条件コード C1 に 1 がセットされます。逆に、使用されているレジスタスタックよりも多くの量をポップした場合はスタックアンダーフローとなり、C1 がゼロクリアされます。

例外処理を行わない場合

コントロールワードの例外マスクをセットする事で、例外処理の発生を抑制する事ができます(参照:「コントロールワードの設定」)。マスクは、例外全部に掛ける事も、部分的に掛ける事もできます。

例外をマスクした場合は、プログラム側が演算をチェックする必要があります。

例.ゼロ除算例外がマスクされている場合

    if (!floatex_nzero(b))
        エラー処理
    else
        floatex_div(a,b);