アプリケーションを開発する場合、浮動小数点のランタイム処理中に発生する可能性のある例外の制御が必要なことがあります。これらの例外は、オーバーフロー、ゼロ除算、アンダーフロー、および無効な演算に分類することができます。
オーバーフローは、浮動小数点演算の丸め結果の絶対値が出力形式の最大有限数を超えると、発生します。演算結果は丸めモードにより異なります。
最近値への丸め (デフォルト): 指定精度内での符号付き (+/-) 無限大
ゼロ値への丸め: 指定精度内での符号付き (+/-) 最大値
正の無限大への丸め: 指定精度内での正の無限大または - (正の最大値)
負の無限大への丸め: 指定精度内での (正の最大値) または負の無限大
例えば、デフォルトの丸めモード (最も近い値に丸めるモード) では、1.E30 * 1.E30 は単精度の浮動小数点範囲をオーバーフローし、結果は正の無限大に、-1.E30 * 1.E30 の結果は負の無限大になります。
ゼロ除算は、除数がゼロで非除数がゼロ以外の有限数のときに発生します。計算結果は符号付き無限大になります。
例えば、2.0E0/+0.0 はゼロ除算例外となり、結果は正の無限大になります。-2.0E0/+0.0 の場合もゼロ除算例外となり、結果は負の無限大になります。
アンダーフローは、四則演算または算術関数の呼び出し演算結果が浮動小数点データ型の正規化された数値の絶対値の最小範囲を下回るときに発生します。各浮動小数点型 (32 ビット、64 ビット、および 128 ビット) には、精度が少し失われることを表す非常に小さな正規化されていない範囲があります。これは、漸次アンダーフロー (gradual underflow) と呼ばれます。例えば、正規化されている単精度浮動小数点値の下限は約 1.E-38 であるのに対し、正規化されていない単精度浮動小数点値の下限は約 1.E-45 です。正規化されていない範囲の下限に満たない結果は、ゼロになります。1.E-30 / 1.E10 は正規化されている範囲ではアンダーフローになりますが、正規化されていない範囲ではアンダーフローにならないため、結果は正規化されていない値 1.E-40 になります。1.E-30 / 1.E30 はすべての範囲でアンダーフローになるため、結果はゼロになります。
無効は、基本的な浮動小数点処理へのオペランドまたは算術関数の入力が未定義 (QNaN) の結果を生成するときに発生します。次にいくつかの例を示します。
浮動小数点演算または算術関数呼び出しにおける SNaN オペランド
ゼロの除算: (+/-0.0)/(+/-0.0)
符合が異なる無限大の合計: 無限大 + (-無限大)
同じ符号を持つ無限大の差分: (+/-無限大) - (+/-無限大)
符号付き無限大のゼロ乗算: (+/-無限大) * 0
算術関数ドメインエラー: log(負数)、sqrt(負数)、asin(|x|>1)
インテル® コンパイラーでは、-fpe オプション (Linux* および Mac OS* X) または /fpe (Windows*) オプションを使用して、浮動小数点例外処理を制御します。