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

退出打印视图

更新时间: 2015 年 1 月
 
 

3.5.1 异常标志函数

fenv.h 文件为 5 个 IEEE 浮点异常标志中的每一个标志都定义了宏:FE_INEXACTFE_UNDERFLOWFE_OVERFLOWFE_DIVBYZEROFE_INVALID。此外,将宏 FE_ALL_EXCEPT 定义为所有 5 个标志宏进行按位“或”运算。在以下说明中,excepts 参数可以是 5 个标志宏中任何一个宏的按位“或”运算或者值 FE_ALL_EXCEPT。对于 fegetexceptflagfesetexceptflag 函数,flagp 参数必须是指向类型为 fexcept_t 的对象的指针。这种类型是在 fenv.h 中定义的。

C99 定义了下表中的异常标志函数:

表 3-15  C99 标准异常标志函数
函数
操作
feclearexcept(excepts)
清除指定的标志
fetestexcept(excepts)
返回指定标志的设置
feraiseexcept(excepts)
引发指定的异常
fegetexceptflag(flagp, excepts)
在 *flagp 中保存指定的标志
fesetexceptflag(flagp, excepts)
从 *flagp 中恢复指定的标志

feclearexcept 函数清除指定的标志。fetestexcept 函数返回与设置的 excepts 参数指定的标志子集对应的宏值的按位“或”运算结果。例如,如果当前设置的标志只有不精确、下溢和除以零,则以下指令将 i 设置为 FE_DIVBYZERO

i = fetestexcept(FE_INVALID | FE_DIVBYZERO);

如果启用任何指定异常的陷阱,则 feraiseexcept 函数会导致一个陷阱。否则,它只设置相应的标志。有关异常陷阱的更多信息,请参见Chapter 4, 异常和异常处理

fegetexceptflagfesetexceptflag 函数提供了一种简便的方法暂时保存某些标志的状态,并在以后恢复它们。特别地,fesetexceptflag 函数并不导致陷阱;它只恢复指定标志的值。