4.4.3. 例外

浮動小数点の算術演算では、さまざまな問題が生じることがあります。 例えば、計算結果が指定の形式に対して大きすぎたり小さすぎたりする場合や、結果を計算する方法がない場合もあります(負の値の平方根を求めようとしたり、ゼロによる除算を行おうとした場合など)。 これらは異常または例外的な状況であるため、「例外」と呼ばれています。

ARM 浮動小数点環境では、複数の方法で例外を処理できます。

例外を無視する

システムによって正しそうな演算結果が生成され、返されます。 例えば、負の値の平方根では NaN が生成され、形式に対して大きすぎる値の計算では無限大が生成されます。 例外が発生し、それが無視されると、浮動小数点ステータスワード内に、過去のある時点で何らかの異常が発生したことを示すフラグが設定されます。

例外をトラップする

例外が発生すると、トラップハンドラと呼ばれるコードが実行されます。 システムには、エラーメッセージを出力してアプリケーションを終了するデフォルトのトラップハンドラが用意されています。 ただし、ユーザが選択した方法で例外条件を解消する独自のトラップハンドラを指定することもできます。 トラップハンドラでは、演算から返される結果を渡すこともできます。

例えば、0 を 0 で割った結果を 1 と見なした方が便利なアルゴリズムがある場合は、その特殊な状況を識別し、必要な答えで置き換える無効演算例外のユーザ定義のトラップハンドラを指定できます。

例外のタイプ

ARM 浮動小数点環境では、以下のタイプの例外が認識されます。

  • 無効演算例外は、演算に対する有意な結果がない場合に発生します。 この例外は、以下のいずれかの理由で発生することがあります。

    • 最も単純な演算(符号のコピーと変更)を除き、シグナル NaN に対する演算を実行した場合

    • 正の無限大を負の無限大に加算した場合、または無限大から無限大を減算した場合

    • 無限大にゼロを乗算した場合

    • 0 を 0 で除算した場合、または無限大を無限大で除算した場合

    • 何らかの値を 0 で除算した場合の、または無限大を何らかの値で除算した場合の剰余を求めた場合

    • 負の値(負のゼロを除く)の平方根を求めた場合

    • 浮動小数点数を整数に変換したが、その結果が形式に収まらなかった場合

    • 2 つの値を比較し、その一方が NaN であった場合

    無効演算例外がトラップされない場合、これらの演算ではすべてクワイエット型 NaN が返されます。ただし、整数への変換ではゼロが返されます(整数にはクワイエット型 NaN がないため)。

  • ゼロ除算例外は、ゼロ以外の有限値をゼロで除算した場合に発生します (ゼロをゼロで除算すると、無効演算例外が発生します。 無限大をゼロで除算するのは有効であり、無限大が返されます)。

    ゼロ除算がトラップされない場合、その演算では無限大が返されます。

  • オーバーフロー例外は、演算結果が大きすぎて形式に収まらない場合に発生します。 例えば、表現可能な最大値(Table 4.14で d が付いている)をその値自体に加算した場合に発生します。

    オーバーフローがトラップされない場合、その演算では丸めモードに応じて、無限大が返されるか、最大の有限値が返されます。

  • アンダーフロー例外は、演算結果が小さすぎて正規化数(Exp が 1 以上)として表現できない場合に発生します。

    アンダーフローが発生する状況は、この例外がトラップされるかどうかによって異なります。

    • アンダーフローがトラップされる場合は、結果が小さすぎて正規化数として表現できない場合に必ず発生します。

    • アンダーフローがトラップされない場合は、結果に丸めが必要な場合にのみ発生します。 したがって、例えば float 値の 0x00800000 を 2 で除算しても、その結果(0x00400000)が正確であるため、アンダーフローは発生しません。 しかし、float 値の 0x00000001 に 1.5 を乗算すると、アンダーフローが発生します。

      (IEEE 754 仕様を熟知している読者のために説明すると、ARM コンパイラでは、丸めの前にごく小さな値を検出し、精度の低下を不正確な結果として検出するための実装オプションが選択されています。)

      アンダーフローがトラップされない場合、結果は現在の丸めモードに応じて、表現可能な最も近い 2 つの非正規化数のいずれかに丸められます。 精度の低下は無視され、最良の結果が返されます。

    • 不正確結果例外は、演算結果に丸めが必要な場合に発生します。 この例外をソフトウェアによるすべての演算で検出すると速度が大幅に低下する可能性があるため、通常の浮動小数点ライブラリでは不正確結果例外はサポートされていません。 拡張浮動小数点ライブラリとハードウェア浮動小数点システムでは、不正確結果例外がサポートされています。

      不正確結果例外がトラップされない場合、結果は通常の方法で丸められます。

      不正確結果のフラグは、オーバーフローとアンダーフローのいずれかがトラップされない場合にも設定されます。

デフォルトでは、いずれの例外もトラップされません。

Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0349AJ
Non-Confidential