libsunmath 関数である ieee_retrospective は、未処理の例外および非標準の IEEE モードに関する情報を出力します。次の内容が報告されます。
必要な情報は、ハードウェア浮動小数点ステータスレジスタから取得されます。
ieee_retrospective は、設定された例外フラグ、およびトラップが有効になっている例外に関する情報を出力します。これらの 2 つの (関連はしていても) 個別の情報を混同しないでください。例外フラグが設定されている場合は、プログラム実行中のある時点でその例外が発生しました。例外に対してトラップが有効になっている場合は、その例外はまだ実際に発生していない可能性がありますが、発生している場合は、SIGFPE シグナルが提供されています。ieee_retrospective メッセージは、例外フラグが設定されている場合は、調査を必要としている可能性がある例外についてユーザーに警告すること、また例外のトラップが有効になっている場合は、その例外がシグナルハンドラによって処理された可能性がある点をユーザーに知らせることを目的にしています。Chapter 4, 例外と例外処理では、例外、シグナル、およびトラップについて説明するとともに、発生した例外の原因を調査する方法を示しています。
プログラムは、いつでも ieee_retrospective を明示的に呼び出すことができます。–f77 互換モードの f95 でコンパイルされた Fortran プログラムは、自動的に ieee_retrospective を呼び出してから終了します。デフォルトモードの f95 でコンパイルされた C/C++ プログラムおよび Fortran プログラムは、自動的に ieee_retrospective を呼び出しません。
ただし、f95 コンパイラは共通例外に対するトラップをデフォルトで有効にするため、プログラムがトラップを明示的に無効にするか、または SIGFPE ハンドラをインストールしないかぎり、このような例外が発生するとプログラムがただちに異常終了することに注意してください。–f77 互換モードでは、コンパイラがトラップを有効にしないため、浮動小数点例外が発生してもプログラムは実行を継続し、終了時に ieee_retrospective 出力でこれらの例外を報告します。
この関数を呼び出すための構文は次のとおりです
C、C++ - ieee_retrospective(fp);
Fortran - call ieee_retrospective()
C 関数の場合、引数 fp は、出力が書き込まれるファイルを指定します。Fortran 関数は、常に出力を stderr に出力します。
次の例は、ieee_retrospective の 6 つの警告メッセージのうちの 4 つを示しています。
Note: IEEE floating-point exception flags raised: Inexact; Underflow; Rounding direction toward zero IEEE floating-point exception traps enabled: overflow; See the Numerical Computation Guide, ieee_flags(3M), ieee_handler(3M), ieee_sun(3m)
警告メッセージは、トラップが有効になっているか、または例外が発生した場合にのみ表示されます。
ieee_retrospective メッセージは、Fortran プログラムから 3 つの方法のいずれかで抑制できます。 1 つの方法は、プログラムが終了する前に、未処理の例外をすべてクリアし、トラップを無効にして、もっとも近い値への丸め、拡張精度、および標準モードに戻す方法です。これを行うには、ieee_flags、ieee_handler、および standard_arithmetic を次のように呼び出します。
character*8 out i = ieee_flags('clearall', '', '', out) call ieee_handler('clear', 'all', 0) call standard_arithmetic()
ieee_retrospective メッセージが表示されないようにするための別の方法は、stderr のファイルへのリダイレクトです。もちろん、プログラムが ieee_retrospective メッセージ以外の出力を stderr に送信する場合は、この方法を使用してはいけません。
3 番目の方法は、たとえば次のように、プログラム内にダミーの ieee_retrospective 関数を含める方法です。
subroutine ieee_retrospective return end