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

退出打印视图

更新时间: 2015 年 1 月
 
 

4.3.2 C99 异常标志函数

C/C++ 程序可以使用 C99 浮点环境函数测试、设置和清除浮点异常标志。头文件 fenv.h 定义五个与五个标准异常相对应的宏:FE_INEXACTFE_UNDERFLOWFE_OVERFLOWFE_DIVBYZEROFE_INVALID。它还定义要与所有这五个异常宏按位“或”的 FE_ALL_EXCEPT 宏。可将这些宏结合在一起,以便测试或清除异常标志的任何子集或者引发任何组合的异常。下面的示例显示如何将这些宏与几个 C99 浮点环境函数结合使用。有关更多信息,请参见 feclearexcept(3M) 手册页。


注 -  为了使行为保持一致,请不要在同一个程序中同时使用 libm 中的 C99 浮点环境函数和扩展以及 libsunmath 中的 ieee_flagsieee_handler 函数。

要清除这五个异常标志,请使用以下命令:

feclearexcept(FE_ALL_EXCEPT);

要测试引发的是无效运算标志还是除以零标志,请使用以下指令:

int i;

i = fetestexcept(FE_INVALID | FE_DIVBYZERO);
if (i & FE_INVALID)
    /* invalid flag was raised */
else if (i & FE_DIVBYZERO)
    /* division-by-zero flag was raised */

fegetexceptflagfesetexceptflag 函数提供一种用来保存和恢复标志子集的方法。下面的示例显示这些函数的一种使用方法。

fexcept_t flags;
 
/* save the underflow, overflow, and inexact flags */
fegetexceptflag(&flags, FE_UNDERFLOW | FE_OVERFLOW | FE_INEXACT);
/* clear these flags */
feclearexcept(FE_UNDERFLOW | FE_OVERFLOW | FE_INEXACT);
/* do a computation that can underflow or overflow */
...
/* check for underflow or overflow */
if (fetestexcept(FE_UNDERFLOW | FE_OVERFLOW) != 0) {
    ...
}
/* restore the underflow, overflow, and inexact flags */
fesetexceptflag(&flags, FE_UNDERFLOW | FE_OVERFLOW, | FE_INEXACT);