浮動小数点ステイタス・ワード (ia32 のみ)

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 のみ) ルーチンを呼び出します。