例外を定義することは困難です。W. Kahan 氏によると、
算術演算例外は、試行された不可分な算術演算が、一般に受け入れられるような結果にならなかったときに発生します。不可分と許容の意味は、時間と場所によって異なります。(『Handling Arithmetic Exceptions』、W. Kahan 著を参照してください)。
たとえば、プログラムで負の数の平方根を求めようとすると例外が発生します。この例は、無効な演算例外の一例です。そのような例外が発生した場合、システムは 2 つの方法のいずれかで対応します。
例外のトラップが無効である場合 (デフォルト) は、例外が発生したことがシステムに記録され、IEEE 754 で指定されている例外演算に関するデフォルトの結果を使用して、プログラムの実行が続行されます。
例外のトラップが有効である場合は、SIGFPE シグナルが生成されます。プログラムに SIGFPE シグナルハンドラがインストールされている場合は、そのシグナルハンドラに制御が移ります。シグナルハンドラが設定されていない場合は、プログラムが中止されます。
IEEE 754 は、5 種類の 基本的な浮動小数点例外 (無効な演算、0 による除算、オーバーフロー、アンダーフロー、および不正確) を定義しています。最初の 3 つ (無効な演算、0 による除算、およびオーバーフロー) は、一般的な例外と呼ばれることがあります。通常、これらの例外が発生した場合は無視できません。 ieee_handler(3m) のマニュアルページには、一般的な例外のみをトラップする簡単な方法が説明されています。ほかの 2 つの例外 (アンダーフローと不正確) はより頻繁に確認されます。実際、ほとんどの浮動小数点演算で不正確例外が発生しています。これらの例外は、通常、常にとは言えませんが、安全に無視できます。Oracle Solaris Studio 12.4 C、C++、および f77 コンパイラは、デフォルトですべての IEEE トラップを無効にします。f95 コンパイラは、デフォルトで一般的な例外に対してトラップを有効にします。f95 –ftrap=none を指定してコンパイルすると、754 標準に準拠するようになります。
Table 4–1 は、IEEE 規格 754 の情報を要約しています。5 つの浮動小数点例外、およびそれらの例外が発生したときの IEEE 演算環境のデフォルトの応答を示しています。
|