このトピックでは、コントロール・ワードに使用できる例外パラメーター、精度パラメーター、丸めパラメーターについて説明します。
例外は、そのビットが 1 に設定されていると無効になり、ビットが 0 にクリアされていると有効になります。例外が無効に設定されている場合 (例外を無効にするには、SETCONTROLFPQQ (IA-32 アーキテクチャーのみ) でフラグを 1 に設定します)、例外が発生しても割り込み信号は生成されません。浮動小数点プロセスは適切な特殊値 (NaN や符号付き無限大など) を返しますが、プログラムの実行は続行されます。GETSTATUSFPQQ (IA-32 アーキテクチャーのみ) を呼び出すことで、(例外が発生した場合) どの例外が発生したのかを調べることができます。
浮動小数点例外でのエラーが有効な場合 (SETCONTROLFPQQ (IA-32 アーキテクチャーのみ) でフラグを 0 にクリアします)、オペレーティング・システムはその例外が発生したときに割り込みを生成します。デフォルト設定では、これらの割り込みはランタイムエラーを引き起こしますが、SIGNALQQ を使用することで割り込みを取得し、独自のエラー処理ルーチンを呼び出すことができます。
設定を変更するときには、既存の設定をすべてクリアしないように注意してください。すべてのオプションをリセットしない場合、変更する値と既存のコントロール・ワードを包含的 OR 演算 (IOR) で組み合わせます。次に例を示します。
USE IFPORT
INTEGER(2) control, newcontrol
CALL GETCONTROLFPQQ(control)
newcontrol = IOR(control,FPCW$INVALID)
! Invalid exception set (disabled).
CALL SETCONTROLFPQQ(newcontrol)
GETCONTROLFPQQ ルーチン、SETCONTROLFPQQ ルーチンおよび GETSTATUSFPQQ ルーチンは、x87 ステータスレジスターのみに影響します。これらのルーチンは、MXCSR レジスター (インテル® SSE 命令とインテル® SSE2 命令のコントロール・レジスターとステータスレジスター) には影響ありません。
IA-32 アーキテクチャー・ベース・システムでは、FPU が浮動小数点を丸める精度を精度ビットによって制御します。次に例を示します。
USE IFPORT
INTEGER(2) control, holdcontrol, newcontrol
CALL GETCONTROLFPQQ(control)
! Clear any existing precision flags.
holdcontrol = IAND(control, NOT(FPCW$MCW_PC))
newcontrol = IOR(holdcontrol, FPCW$64)
! Set precision to 64 bits.
CALL SETCONTROLFPQQ(newcontrol)
精度オプションは一度に 1 つのみ使用できます。複数のオプションを設定すると、無効なモードになったり、設定したいモードとは異なるモードになることがあります。このため、新しい精度モードを設定するときには、その前に精度ビットをすべてクリアするようにしてください。
GETCONTROLFPQQ ルーチンと SETCONTROLFPQQ ルーチンは、x87 ステータスレジスターのみに影響します。これらのルーチンは、MXCSR レジスター (インテル® SSE 命令とインテル® SSE2 命令のコントロール・レジスターとステータスレジスター) には影響ありません。
IA-32 アーキテクチャー・ベース・システムでは、FPU が使用する丸めの方式を丸めフラグによって制御します。次に例を示します。
USE IFPORT
INTEGER(2) status, control, controlo, mask_all_traps
CALL GETCONTROLFPQQ(control)
WRITE (*, 9000) 'Control word: ', control
>! Save old control word
controlo = control
! Clear the rounding control flags
control = IAND(control,NOT(FPCW$MCW_RC))
! Set new control to round up
control = IOR(control,FPCW$UP)
CALL SETCONTROLFPQQ(control)
CALL GETCONTROLFPQQ(control)
WRITE (*, 9000) 'Control word: ', control
丸めオプションは一度に 1 つのみ使用できます。複数のオプションを設定すると、無効なモードになったり、設定したいモードとは異なるモードになることがあります。このため、新しい丸めモードを設定するときには、その前に丸めビットをすべてクリアするようにしてください。
GETCONTROLFPQQ ルーチンと SETCONTROLFPQQ ルーチンは、x87 ステータスレジスターのみに影響します。これらのルーチンは、MXCSR レジスター (インテル® SSE 命令とインテル® SSE2 命令のコントロール・レジスターとステータスレジスター) には影響ありません。