実行時の数値演算例外の処理 (ia32 のみ)

ia32 システムでは,実行時のサブルーチン MATHERRQQ (ia32 のみ) が,SINLOG10 などの数学関数内で起こる浮動小数点例外を処理します。

リンカーが実行形式プログラムに自動的に取り込む基本版の MATHERRQQ を使用すると,数値演算例外は標準の実行時のエラーを引き起こします (forrtl:severe (nnnn):sqrt:domain error など)。1 つまたは複数の数値演算例外の動作を変更したい場合,独自の MATHERRQQ を用意する必要があります。実行時の数値演算例外では,エラー処理ルーチンは例外を引き起こしたプログラム単位に返ることができるので,浮動小数点例外よりも柔軟に処理を行うことができます。

...\DF98\INCLUDE フォルダの DFLIB.F90 モジュールには,実行時の数値演算例外の定義が含まれています。これらの定義を次表に示します。

パラメタ名 説明
MTH$E_DOMAIN 1 引数ドメイン・エラー
MTH$E_SINGULARITY 2 引数の特異性
MTH$E_OVERFLOW 3 オーバーフロー範囲エラー
MTH$E_UNDERFLOW 4 アンダーフロー範囲エラー
MTH$E_TLOSS 5 精度の完全な低下
MTH$E_PLOSS 6 精度の部分的な低下

ドメイン・エラーとは,SQRT(-1) のように,引数が数学関数のドメインの範囲外にあるということです。特異性のエラーとは,LOG10(0.0) のように,引数がその数学関数にとって特異的な値であり,その値に対する結果が定義されていないということです。オーバーフローとアンダーフローのエラーは浮動小数点の対応するエラーと同じで,精度の低下は浮動小数点の不正確な結果と同じです。

数学関数によって生成されるエラーを解決する MATHERRQQ サブルーチンを書くことができます。MATHERRQQ は,エラーが起きた場合には警告を発行し,基本値を代入したり,その他の動作を実行することができます。独自の MATHERRQQ サブルーチンを用意しないと,浮動小数点ライブラリーに含まれている基本 MATHERRQQ がプログラムを終了させます。次に,代替の MATHERRQQ サブルーチンの例を示します (...\DF98\SAMPLES\TUTORIAL フォルダの MATHERR.F90)。

	SUBROUTINE MATHERRQQ( name, length, info, retcode)
	  USE DFLIB
	  INTEGER(2) length, retcode
	  CHARACTER(length) name
	  RECORD /MTH$E_INFO/ info
	  PRINT *, "Entered MATHERRQQ"
	  PRINT *, "Failing function is:", name
	  PRINT *, "Error type is:", info.errcode
	  IF ((info.ftype == TY$REAL4 ).OR.(info.ftype == TY$REAL8)) THEN
	    PRINT *, "Type:REAL"
	    PRINT *, "Enter the desired function result:"
	    READ(*,*) info.r8res
	    retcode = 1
	  ELSE IF ((info.ftype == TY$CMPLX8 ).OR.(info.ftype == TY$CMPLX16)) THEN
	    PRINT *, "Type:COMPLEX"
	    PRINT *, "Enter the desired function result:"
	    READ(*,*) info.c16res
	    retcode = 1
	  END IF
	END

次に,MATHERRQQ の呼び出しを引き起こす Visual Fortran サンプル・プログラムを示します (...\DF98\SAMPLES\TUTORIAL フォルダの MATHTEST.F90)。

	REAL(4) r1, r2 /-1.0/
	REAL(8) r3, r4 /-1.0/
	COMPLEX(4) c1, c2 /(0.0, 0.0)/
	r1 = LOG(r2)
	r3 = SQRT(r4)
	c1 = CLOG(c2)

	WRITE(*, *) r1
	WRITE(*, *) r3
	WRITE(*, *) c1
	END