浮動小数点ステータスワードの理解

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

Note icon

GETSTAUSFPQQ ルーチンと CLEARSTATUSFPQQ ルーチンは、x87 ステータスレジスターのみに影響します。これらのルーチンは、MXCSR レジスター (インテル® SSE 命令とインテル® SSE2 命令のコントロール・レジスターとステータスレジスター) には影響ありません。