fpgets 和 fpsets 子例程
fpsets 和 fpgets 子例程提供了一种处理或查询浮点状态和控制寄存器的方法。
您可以在 fpstat(一组逻辑程序) 中来回传递信息,而不是直接调用操作系统例程。 下表显示了处理异常的最常用数组元素:
要设置为启用的数组元素
|
要
检查是否发生异常 的数组元素 |
.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)除外,仅当重置特定异常位时才会重置这些异常位。
使用 fpgets 和 fpsets 子例程 (而不是使用 -qflttrap 选项的子选项控制所有内容) 的优点包括控制异常检查的粒度。 例如,当程序结束时,您可能只想测试程序中的任何位置是否发生异常。
这种方法的缺点包括:
- 您必须更改源代码。
- 这些例程与您在其他平台上可能习以为常的例程不同。
例如,要捕获浮点溢出异常,但仅在程序的特定部分中,应将
fpstat(fpoe) 设置为 .TRUE. 并调用 fpsets。 发生异常后,相应的异常位 fpstat(fpox)为 .TRUE. ,直到程序运行为止: call fpgets(fpstat)
fpstat(fpox) = .FALSE.
call fpsets(fpstat) ! resetting fpstat(fpox) to .FALSE.