函数
feclearexcept (C++11)
<cfenv>
int feclearexcept(int excepts);
清除浮点异常
试图清除 excepts 指定的浮点异常。
调用这个函数的程序需要确保在本次函数调用时,编译指示 FENV_ACCESS 已经开启。
参数
excepts
位掩码值:支持的任何浮点异常数字的组合(按位 OR):
宏值 | 描述 |
---|---|
FE_DIVBYZERO | 极错误:被 0 除,或一些其他渐进无限的结果(从有限的参数)。 |
FE_INEXACT | 不精确:结果不准确。 |
FE_INVALID | 作用域错误:至少一个参数是函数没有定义的值。 |
FE_OVERFLOW | 上溢错误:结果太大了,超出了返回值类型能表示的数量级。 |
FE_UNDERFLOW | 下一错误:结果太小了,超出了返回值类型能表示的数量级。 |
FE_ALL_EXCEPT | 所有异常(选择实现支持的所有异常) |
特定的库实现可能会支持附加的 浮点异常 值(它们对应的宏同样以 FE_ 开头的宏)。
C99
库可能定义在 <fenv.h>,仅仅支持上面这些宏值(其他可能没有被定义)。
C++11
至少上面所有的宏值都定义在 <fenv.h> 中(即使实现不支持)。
返回值
如果所有在 excepts 中的异常都被清除的话(或者 excepts 为 0 ),则返回 0 ,否则返回非 0 。
例子
/* feclearexcept, fetestexcept example */
#include <stdio.h> /* printf */
#include <math.h> /* sqrt */
#include <fenv.h> /* feclearexcept, fetestexcept, FE_ALL_EXCEPT, FE_INVALID */
#pragma STDC FENV_ACCESS on
int main()
{
feclearexcept(FE_ALL_EXCEPT);
sqrt(-1);
if(fetestexcept(FE_INVALID))
printf("sqrt(-1) raises FE_INVALID\n");
return 0;
}
可能的输出:
sqrt(-1) raises FE_INVALID
数据竞争
每个线程都保持着分离的、拥有自己状态的 浮点环境 。产生一个新线程就复制当前状态。[ 这个适用于 C11 和 C++11 的实现 ]
异常
不抛出异常的保证:这个函数从不抛出异常。
注意 C 浮点环境异常 不是 C++ 异常,因此不能被 try/catch 块捕捉。
调用这个函数的时候,如果编译指示 FENV_ACCESS 关闭的话,则会导致未定义行为。
另请参见
函数 | 描述 |
---|---|
feraiseexcept | 触发浮点异常 (函数) |
fetestexcept | 测试浮点异常 (函数) |
当前内容版权归 chrisniael 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 chrisniael .