函数

feholdexcept (C++11)

int feholdexcept(fenv_t *envp);

保留浮点异常

保存 浮点环境 的当前状态至 envp 指向的对象中。然后会重置当前状态,并且如果支持的话会设置环境为 non-stop 模式。

调用这个函数的程序需要确保在本次函数调用时,编译指示 FENV_ACCESS 已经开启。

参数

envp

指向存储浮点环境状态的 fenv_t 对象的指针。

返回值

如果函数成功执行的话,包括设置 浮点环境 为 non-stop 模式,则返回 0, 否则返回非 0。

例子


1. /* feholdexcept / feupdateenv example */
2. #include <stdio.h>    /* printf, puts */
3. #include <fenv.h>    /* feholdexcept, feclearexcept, fetestexcept, feupdateenv, FE_* */
4. #include <math.h>    /* log */
5. #pragma STDC FENV_ACCESS on

7. double log_zerook(double x)
8. {
9. fenv_t fe;
10. feholdexcept(&fe);
11. x = log(x);
12. feclearexcept(FE_OVERFLOW | FE_DIVBYZERO);
13. feupdateenv(&fe);
14. return x;
15. }

17. int main()
18. {
19. feclearexcept(FE_ALL_EXCEPT);
20. printf("log(0.0): %f\n", log_zerook(0.0));
21. if(!fetestexcept(FE_ALL_EXCEPT));
22. puts("no exceptions raised");

24. return 0;
25. }

可能的输出:


1. log(0.0): -inf
2. no exceptions raised

数据竞争

每个线程都保持着分离的、拥有自己状态的 浮点环境 。产生一个新线程就复制当前状态。[ 这个适用于 C11 和 C++11 的实现 ]

异常

不抛出异常的保证:这个函数从不抛出异常。
注意 C 浮点环境异常 不是 C++ 异常,因此不能被 try/catch 块捕捉。

另请参见

函数 描述
fegetenv 获取浮点环境 (函数)
fesetenv 设置浮点环境 (函数)
feclearexcept 清除浮点异常 (函数)