Oracle® Solaris Studio 12.4:数值计算指南

退出打印视图

更新时间: 2015 年 1 月
 
 

3.4.4 ieee_retrospective(3m)

libsunmath 函数 ieee_retrospective 打印有关未处理异常和非标准 IEEE 模式的信息。它报告:

  • 未处理异常。

  • 启用的陷阱。

  • 如果将舍入方向或精度设置为非缺省值。

  • 如果非标准算法生效的话。

从硬件浮点状态寄存器获得所需的信息。

ieee_retrospective 打印有关引发的异常标志以及启用陷阱 的异常的信息。不应混淆这两种截然不同的信息(即使它们有关联也是如此)。如果引发异常标志,则该异常是在执行程序过程中某一时刻发生的。如果为异常启用了陷阱,则异常可能并没有实际发生,但如果发生了,会提供 SIGFPE 信号。ieee_retrospective 消息用于提示您有关可能需要调查的异常的信息(如果引发了异常标志),或者提示您信号处理程序可能已处理了异常(如果启用了异常的陷阱)。Chapter 4, 异常和异常处理讨论了异常、信号和陷阱,并说明如何调查引发异常的原因。

程序可以随时显式调用 ieee_retrospective。在 –f77 兼容模式下使用 f95 编译的 Fortran 程序会在其退出前自动调用 ieee_retrospective。在缺省模式下使用 f95 编译的 C/C++ 程序和 Fortran 程序不会自动调用 ieee_retrospective

注意,在缺省情况下,f95 编译器会对常见异常启用捕获,因此,除非有程序显式禁用捕获或者安装 SIGFPE 处理程序,否则在发生此类异常时程序会立即中止。在 –f77 兼容模式下,编译器并不启用捕获,因此当发生浮点异常时,程序继续执行,并在退出时通过 ieee_retrospective 输出报告这些异常。

调用此函数的语法为:

  • C、C++-ieee_retrospective(fp);

  • Fortran-call ieee_retrospective()

对于 C 函数,参数 fp 指定写入输出的文件。Fortran 函数始终在 stderr 上打印输出。

以下示例显示 6 个 ieee_retrospective 警告消息中的 4 个:

Note: IEEE floating-point exception flags raised:
   Inexact; Underflow; 
Rounding direction toward zero 
IEEE floating-point exception traps enabled: 
   overflow; 
See the Numerical Computation Guide, ieee_flags(3M), 
ieee_handler(3M), ieee_sun(3m)

只有在启用捕获或引发异常时,才会出现警告消息。

可以在 Fortran 程序中使用三种方法之一来禁止 ieee_retrospective 消息。 一种方法是清除所有未处理的异常,禁用陷阱,并在程序退出前恢复舍入到最接近的值、扩展精度和标准模式。为此,请按如下方式调用 ieee_flagsieee_handlerstandard_arithmetic

character*8 out 
i = ieee_flags('clearall', '', '', out) 
call ieee_handler('clear', 'all', 0)
call standard_arithmetic()

注 -  建议不要不调查其原因就清除未处理的异常。

另一种避免看到 ieee_retrospective 消息的方法是将 stderr 重定向到某个文件。当然,如果程序还将其他非 ieee_retrospective 消息的输出发送到 stderr,则不应使用这种方法。

第三种方法是在程序中包含伪 ieee_retrospective 函数,例如:

subroutine ieee_retrospective
return
end