C/C++ 程序可以使用 C99 浮点环境函数测试、设置和清除浮点异常标志。头文件 fenv.h 定义五个与五个标准异常相对应的宏:FE_INEXACT、FE_UNDERFLOW、FE_OVERFLOW、FE_DIVBYZERO 和 FE_INVALID。它还定义要与所有这五个异常宏按位“或”的 FE_ALL_EXCEPT 宏。可将这些宏结合在一起,以便测试或清除异常标志的任何子集或者引发任何组合的异常。下面的示例显示如何将这些宏与几个 C99 浮点环境函数结合使用。有关更多信息,请参见 feclearexcept(3M) 手册页。
要清除这五个异常标志,请使用以下命令:
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 */
fegetexceptflag 和 fesetexceptflag 函数提供一种用来保存和恢复标志子集的方法。下面的示例显示这些函数的一种使用方法。
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);