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);