fpgets 和 fpsets 子例程

fpsetsfpgets 子例程提供了一种处理或查询浮点状态和控制寄存器的方法。

您可以在 fpstat(一组逻辑程序) 中来回传递信息,而不是直接调用操作系统例程。 下表显示了处理异常的最常用数组元素:

表 1. 要与 fpset 和 fpgets 配合使用的异常位
要设置为启用的数组元素

检查是否发生异常
的数组元素
.TRUE 时指示的异常。
不适用 fpstat (fpfx) 浮点异常摘要
不适用 fpstat (fpfex) 已启用浮点的异常摘要
fpstat (fpve) fpstat (fpvx) 浮点无效操作异常摘要
fpstat (fpoe) fpstat (fpox) 浮点溢出异常
fpstat (fpue) fpstat (fpux) 浮点下溢异常
fpstat (fpze) fpstat (fpzx) 零除异常
fpstat (fpxe) fpstat (fpxx) 不精确异常
fpstat (fpve) fpstat (fpvxsnan) 浮点无效操作异常 ( NaNS )
fpstat (fpve) fpstat (fpvxisi) 浮点无效操作异常 (INF-INF)
fpstat (fpve) fpstat (fpvxidi) 浮点无效操作异常 (INF/INF)
fpstat (fpve) fpstat (fpvxzdz) 浮点无效操作异常 (0/ 0)
fpstat (fpve) fpstat (fpvximz) 浮点无效操作异常 (INF* 0)
fpstat (fpve) fpstat (fpvxvc) 浮点无效操作异常 (无效比较)
不适用 fpstat (fpvxsoft) 浮点无效操作异常 (软件请求) ,仅 PowerPC®
不适用 fpstat (fpvxsqrt) 浮点无效操作异常 (无效的平方根) ,仅 PowerPC
不适用 fpstat (fpvxcvi) 浮点无效操作异常 (整数转换无效) ,仅 PowerPC

要在程序中的特定点显式地检查特定异常,请使用 fpgets ,然后测试 fpstat 中的元素是否已更改。 发生异常后,将设置相应的异常位 (上表中的第二列) ,直到显式重置为止,但 fpstat(fpfx)fpstat(fpvx)fpstat(fpfex)除外,仅当重置特定异常位时才会重置这些异常位。

使用 fpgetsfpsets 子例程 (而不是使用 -qflttrap 选项的子选项控制所有内容) 的优点包括控制异常检查的粒度。 例如,当程序结束时,您可能只想测试程序中的任何位置是否发生异常。

这种方法的缺点包括:
  • 您必须更改源代码。
  • 这些例程与您在其他平台上可能习以为常的例程不同。
例如,要捕获浮点溢出异常,但仅在程序的特定部分中,应将 fpstat(fpoe) 设置为 .TRUE. 并调用 fpsets。 发生异常后,相应的异常位 fpstat(fpox).TRUE. ,直到程序运行为止:
      call fpgets(fpstat)
      fpstat(fpox) = .FALSE.
      call fpsets(fpstat)   ! resetting fpstat(fpox) to .FALSE.