函数
feholdexcept (C++11)
int feholdexcept(fenv_t *envp);
保留浮点异常
保存 浮点环境 的当前状态至 envp 指向的对象中。然后会重置当前状态,并且如果支持的话会设置环境为 non-stop 模式。
调用这个函数的程序需要确保在本次函数调用时,编译指示 FENV_ACCESS 已经开启。
参数
envp
指向存储浮点环境状态的 fenv_t 对象的指针。
返回值
如果函数成功执行的话,包括设置 浮点环境 为 non-stop 模式,则返回 0, 否则返回非 0。
例子
/* feholdexcept / feupdateenv example */
#include <stdio.h> /* printf, puts */
#include <fenv.h> /* feholdexcept, feclearexcept, fetestexcept, feupdateenv, FE_* */
#include <math.h> /* log */
#pragma STDC FENV_ACCESS on
double log_zerook(double x)
{
fenv_t fe;
feholdexcept(&fe);
x = log(x);
feclearexcept(FE_OVERFLOW | FE_DIVBYZERO);
feupdateenv(&fe);
return x;
}
int main()
{
feclearexcept(FE_ALL_EXCEPT);
printf("log(0.0): %f\n", log_zerook(0.0));
if(!fetestexcept(FE_ALL_EXCEPT));
puts("no exceptions raised");
return 0;
}
可能的输出:
log(0.0): -inf
no exceptions raised
数据竞争
每个线程都保持着分离的、拥有自己状态的 浮点环境 。产生一个新线程就复制当前状态。[ 这个适用于 C11 和 C++11 的实现 ]
异常
不抛出异常的保证:这个函数从不抛出异常。
注意 C 浮点环境异常 不是 C++ 异常,因此不能被 try/catch 块捕捉。
另请参见
函数 | 描述 |
---|---|
fegetenv | 获取浮点环境 (函数) |
fesetenv | 设置浮点环境 (函数) |
feclearexcept | 清除浮点异常 (函数) |
当前内容版权归 chrisniael 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 chrisniael .