控制浮点状态和控制寄存器
在引入 -qflttrap 子选项或 -qsigtrap 选项之前,大多数浮点异常处理都要求您更改源文件以打开异常捕获或安装信号处理程序。
虽然您仍可以这样做,但对于任何新应用程序,我们建议您改为使用选项。
要在运行时控制异常处理,请在不使用 -qflttrap 选项的 enable 子选项的情况下进行编译:
xlf95 -qflttrap compute_pi.f # Check all exceptions, but do not trap.
xlf95 -qflttrap=ov compute_pi.f # Check one type, but do not trap.然后,在程序内处理 fpstats 数组 (在包含文件 /usr/include/fpdc.h中定义) 并调用 fpsets 子例程以指定哪些异常应生成陷阱。请参阅 选择舍入方式中使用 fpsets 和 fpgets 的样本程序。
另一种方法是在 xlf_fp_util 模块中使用 set_fpscr_flags() 子例程。 此子例程允许您设置在 MASK 参数中指定的浮点状态和控制寄存器标志。 未在 MASK 中指定的标志仍不受影响。 MASK 的类型必须为 INTEGER(FPSCR_KIND)。 例如:
USE, INTRINSIC :: xlf_fp_util
INTEGER(FPSCR_KIND) SAVED_FPSCR
INTEGER(FP_MODE_KIND) FP_MODE
SAVED_FPSCR = get_fpscr() ! Saves the current value of
! the fpscr register.
CALL set_fpscr_flags(TRP_DIV_BY_ZERO) ! Enables trapping of
! ... ! divide-by-zero.
SAVED_FPSCR=set_fpscr(SAVED_FPSCR) ! Restores fpscr register.
另一种方法是在
ieee_exceptions 模块中使用 ieee_set_halting_mode 子例程。 此 可移植子例程 允许您设置任何 FPSCR 异常标志的停止 (捕获) 状态。 例如:USE, INTRINSIC :: ieee_exceptions
TYPE(IEEE_STATUS_TYPE) SAVED_FPSCR
CALL ieee_get_status(SAVED_FPSCR) ! Saves the current value of the
! fpscr register
CALL ieee_set_halting_mode(IEEE_DIVIDE_BY_ZERO, .TRUE.) ! Enabled trapping
! ... ! of divide-by-zero.
CALL IEEE_SET_STATUS(SAVED_FPSCR) ! Restore fpscr register