ia32 システムでは,FPU ステイタス・ワードには,プロセッサーの浮動小数点例外状態を示すビットが含まれています。ステイタス・ワード・パラメタは,無効な結果,規格化されていない結果,ゼロによる除算,オーバーフロー,アンダーフロー,および正確でない精度の 6 つの例外を記述します。これらについては,「誤差による精度の低下:丸め,特殊値,アンダーフロー,およびオーバーフロー」で説明しています。いずれかのビットが 1 に設定されていれば,それは過去の浮動小数点演算でその例外形式が発生したことを示しています。Visual Fortran は最初のすべてのステイタス・ビットをクリアします。例外が起こると,ステイタス・ビットをリセットしないまま,それ以降の浮動小数点演算を実行します。つまり,ステイタス・ビットは累積します。
次表に,浮動小数点例外のステイタス・ワードを示します。
パラメタ名 | 16 進値 | 説明 |
FPSW$MSW_EM | #003F | ステイタス・マスク (すべてのビットを 1 に設定)。 |
FPSW$INVALID | #0001 | 無効な結果が発生した。 |
FPSW$DENORMAL | #0002 | 規格化されていない数 (きわめて小さい数値) が発生した。 |
FPSW$ZERODIVIDE | #0004 | ゼロによる除算が起きた。 |
FPSW$OVERFLOW | #0008 | オーバーフローが起きた。 |
FPSW$UNDERFLOW | #0010 | アンダーフローが起きた。 |
FPSW$INEXACT | #0020 | 不正確な精度が発生した。 |
ステイタス・ワードを取得して,例外パラメタと比較することで,どの例外が発生したのかを調べることができます。次に例を示します。
USE DFLIB INTEGER(2) status CALL GETSTATUSFPQQ(status) IF ((status .AND. FPSW$INEXACT) > 0) THEN WRITE (*, *) "Inexact precision has occurred" ELSE IF ((status .AND. FPSW$DENORMAL) > 0) THEN WRITE (*, *) "Denormal occurred" END IF
ステイタス・ワード・フラグをクリアするには,CLEARSTATUSFPQQ (ia32 のみ) ルーチンを呼び出します。