例外パラメーター、精度パラメーター、丸めパラメーターの使用

このトピックでは、コントロール・ワードに使用できる例外パラメーター、精度パラメーター、丸めパラメーターについて説明します。

例外パラメーター

例外は、そのビットが 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)

Note icon

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 つのみ使用できます。複数のオプションを設定すると、無効なモードになったり、設定したいモードとは異なるモードになることがあります。このため、新しい精度モードを設定するときには、その前に精度ビットをすべてクリアするようにしてください。

Note icon

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 つのみ使用できます。複数のオプションを設定すると、無効なモードになったり、設定したいモードとは異なるモードになることがあります。このため、新しい丸めモードを設定するときには、その前に丸めビットをすべてクリアするようにしてください。

Note icon

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