IA-32 アーキテクチャー・ベース・システムでは、FPU ステータスワードには、プロセッサーの浮動小数点例外ステータスを示すビットが含まれています。ステータス・ワード・パラメーターは 6 つの例外 (無効な結果、正規化されていないオペランド、ゼロによる除算、オーバーフロー、アンダーフロー、および正確ではない精度) を記述します。これらについては「誤差による精度の低下」で説明しています。過去の浮動小数点演算でこれらの例外が発生した場合、いずれかのビットが 1 に設定されます (インテル® 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 IFPORT
INTEGER(2) status
CALL GETSTATUSFPQQ(status)
IF (IAND (status, FPSW$INEXACT) > 0) THEN
WRITE (*, *) "Inexact precision has occurred"
ELSE IF (IAND (status, FPSW$DENORMAL) > 0) THEN
WRITE (*, *) "Denormal occurred"
END IF
ステータス・ワード・フラグをクリアするには、CLEARSTATUSFPQQ (IA-32 アーキテクチャーのみ) ルーチンを呼び出します。
GETSTAUSFPQQ ルーチンと CLEARSTATUSFPQQ ルーチンは、x87 ステータスレジスターのみに影響します。これらのルーチンは、MXCSR レジスター (インテル® SSE 命令とインテル® SSE2 命令のコントロール・レジスターとステータスレジスター) には影響ありません。