3.30 ARM 浮動小数点環境で認識される例外のタイプ

ARM 浮動小数点環境では、いくつかの異なるタイプの例外が認識されます。

無効演算例外
演算に対する有意な結果がない場合に発生します。この例外は、以下のいずれかの理由で発生することがあります。
  • 最も単純な演算(符号のコピーと変更)を除き、シグナル NaN に対する演算を実行した場合。
  • 正の無限大を負の無限大に加算した場合、または無限大から無限大を減算した場合。
  • 無限大にゼロを乗算した場合。
  • 0 を 0 で除算した場合、または無限大を無限大で除算した場合。
  • 何らかの値を 0 で除算した場合の、または無限大を何らかの値で除算した場合の剰余を求めた場合。
  • 負の値(負のゼロを除く)の平方根を求めた場合。
  • 浮動小数点数を整数に変換したが、その結果が形式に収まらなかった場合。
  • 2 つの値を比較し、その一方が NaN であった場合。
無効演算例外がトラップされない場合、これらの演算ではクワイエット型 NaN が返されます。ただし、整数への変換では、整数にクワイエット型 NaN がないため、ゼロが返されます。
ゼロ除算例外
ゼロ以外の有限値をゼロで除算した場合に発生します。次の点に注意して下さい。
  • ゼロをゼロで除算すると、無効演算例外が発生します。
  • 無限大をゼロで除算するのは有効であり、無限大が返されます。
ゼロ除算がトラップされない場合、その演算では無限大が返されます。
オーバーフロー例外
演算結果が大きすぎて形式に収まらない場合に発生します。例えば、表現可能な最大値をその値自体に加算した場合に発生します。最大の float 値は 0x7F7FFFFF です。
オーバーフローがトラップされない場合、その演算では丸めモードに応じて、無限大が返されるか、最大の有限値が返されます。
アンダーフロー例外
演算結果が小さすぎて正規化数(Exp が 1 以上)として表現できない場合に発生します。
アンダーフローが発生する状況は、この例外がトラップされるかどうかによって異なります。
  • アンダーフローがトラップされる場合は、結果が小さすぎて正規化数として表現できない場合に必ず発生します。
  • アンダーフローがトラップされない場合は、結果に丸めが必要な場合にのみ発生します。したがって、例えば float 値の 0x00800000 を 2 で除算しても、その結果(0x00400000)が正確であるため、アンダーフローは発生しません。しかし、float 値の 0x00000001 に 1.5 を乗算すると、アンダーフローが発生します。

    IEEE 754 仕様を熟知している読者のために説明すると、ARM コンパイラでは、丸めの前にごく小さな値を検出し、精度の低下を不正確な結果として検出するための実装オプションが選択されています。
    アンダーフローがトラップされない場合、結果は現在の丸めモードに応じて、表現可能な最も近い 2 つの非正規化数のいずれかに丸められます。精度の低下は無視され、最良の結果が返されます。
  • 不正確結果例外は、演算結果に丸めが必要な場合に発生します。この例外をソフトウェアによるすべての演算で検出すると速度が大幅に低下する可能性があるため、通常の浮動小数点ライブラリでは不正確結果例外はサポートされていません。拡張浮動小数点ライブラリとハードウェア浮動小数点システムでは、不正確結果例外がサポートされています。
    不正確結果例外がトラップされない場合、結果は通常の方法で丸められます。
    不正確結果のフラグは、オーバーフローとアンダーフローのいずれかがトラップされない場合にも設定されます。
デフォルトでは、いずれの例外もトラップされません。
関連する概念
3.17 ユーザ定義の例外トラップハンドラの記述
3.12 例外フラグの処理
3.18 ユーザ定義の例外ハンドラの例
3.19 シグナルによる例外トラップ処理
3.22 IEEE 754 算術演算
3.29 IEEE 754 浮動小数点演算で発生する例外
関連する参考文書
1.83 C ライブラリの signal() 関数と追加の型引数によりサポートされる ISO 準拠のシグナルの実装
3.26 IEEE 754 算術演算の単精度浮動小数点数値のサンプル
関連情報
IEEE Standard for Floating-Point Arithmetic (IEEE 754), 1985 version
非機密扱いPDF file icon PDF 版ARM DUI0475KJ
Copyright © 2010-2014 ARM.All rights reserved.