概要: 浮動小数点例外の制御

アプリケーションを開発する場合、浮動小数点のランタイム処理中に発生する可能性のある例外の制御が必要なことがあります。これらの例外は、オーバーフロー、ゼロ除算、アンダーフロー、および無効な演算に分類することができます。

オーバーフロー

オーバーフローは、浮動小数点演算の丸め結果の絶対値が出力形式の最大有限数を超えると、発生します。演算結果は丸めモードにより異なります。

例えば、デフォルトの丸めモード (最も近い値に丸めるモード) では、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) の結果を生成するときに発生します。次にいくつかの例を示します。

インテル® コンパイラーでは、-fpe オプション (Linux* および Mac OS* X) または /fpe (Windows*) オプションを使用して、浮動小数点例外処理を制御します。