当尝试执行的原子算术运算没有生成可普遍接受的结果时,就产生了运算异常。原子和可接受的含义随时间和使用场合而异。(请参见 W. Kahan 编著的《Handling Arithmetic Exceptions》。)
例如,当某个程序尝试求负数的平方根时,会产生异常。这是无效运算异常的一个示例。在出现此类异常时,系统会以下列两种方式之一进行响应:
如果该异常的陷阱处于禁用状态(缺省情况),系统将记录异常发生这一事实,并使用 IEEE 754 针对异常运算指定的缺省结果继续执行该程序。
如果该异常的陷阱处于启用状态,系统将生成 SIGFPE 信号。如果程序安装了 SIGFPE 信号处理程序,系统会将控制转交给该处理程序;否则,该程序将中止。
IEEE 754 定义了五个基本类型的浮点异常:无效运算、除以零、溢出、下溢和不精确。前三个(无效、除和溢出)有时统称为常见异常。这些异常一旦出现,很少可被忽略。ieee_handler(3m) 手册页介绍了一种仅适用于在出现常见异常时自陷的简便方法。 另外两种异常(下溢和不精确)更常见。实际上,大多数浮点运算都会导致不精确异常。这些异常通常(尽管不总是)可以安全地忽略。缺省情况下,Oracle Solaris Studio 12.4 C、C++ 和 f77 编译器将禁用所有 IEEE 陷阱。f95 编译器在缺省情况下将对常见异常启用陷阱。可通过使用 f95 –ftrap=none 进行编译来恢复符合 754 标准。
Table 4–1 简要介绍了 IEEE 标准 754 中的信息。它描述了五个浮点异常,以及在出现这些异常时 IEEE 运算环境的缺省响应。
|