函数
fetestexcept (C++11)
int fetestexcept(int excepts);
测试浮点异常
返回在 excepts 中当前设置的异常。
返回值是用按位或表示的 excepts 中被当前 浮点环境 设置的异常的集合。如果 excepts 中的异常一个没有被设置,则返回 0。
调用这个函数的程序需要确保在本次函数调用时,编译指示 FENV_ACCESS 已经开启。
参数
excepts
位掩码值:支持的任何浮点异常数字的组合(按位 OR):
| 宏值 | 描述 |
|---|---|
| FE_DIVBYZERO | 极错误:被 0 除,或一些其他渐进无限的结果(从有限的参数)。 |
| FE_INEXACT | 不精确:结果不准确。 |
| FE_INVALID | 作用域错误:至少一个参数是函数没有定义的值。 |
| FE_OVERFLOW | 上溢错误:结果太大了,超出了返回值类型能表示的数量级。 |
| FE_UNDERFLOW | 下一错误:结果太小了,超出了返回值类型能表示的数量级。 |
| FE_ALL_EXCEPT | 所有异常(选择实现支持的所有异常) |
特定的库实现可能会支持附加的 浮点异常 值(它们对应的宏同样以 FE_ 开头的宏)。
C99
库可能定义在
C++11
返回值
如果 excepts 中的异常没有一个被设置的话,则返回 0,否则返回当前设置的异常(在 excepts 中的)。
例子
1. /* fetestexcept example */
2. #include <stdio.h> /* puts */
3. #include <fenv.h> /* feraiseexcept, fetestexcept, FE_* */
4. #pragma STDC FENV_ACCESS on
6. double fn(double x)
7. {
8. /* some function for which zero is a domain and range error */
9. if(x == 0.0)
10. feraiseexcept(FE_INVALID | FE_OVERFLOW);
11. return x;
12. }
14. int main()
15. {
16. int fe;
18. feclearexcept(FE_ALL_EXCEPT);
19. fn(0.0);
21. /* testing for single exception: */
22. if(fetestexcept(FE_OVERFLOW))
23. puts("FE_OVERFLOW is set");
25. /* testing multiple exceptions: */
26. fe = fetestexcept(FE_ALL_EXCEPT);
28. puts("The following exceptions are set:");
29. if(fe & FE_DIVBYZERO)
30. puts("FE_DIVBYZERO");
31. if(fe & FE_INEXACT)
32. puts("FE_INEXACT");
33. if(fe &FE_INVALID)
34. puts("FE_INVALID");
35. if(fe & FE_OVERFLOW)
36. puts("FE_OVERFLOW");
37. if(fe & FE_UNDERFLOW)
38. puts("FE_UNDERFLOW");
40. return 0;
41. }
可能的输出:
1. FE_OVERFLOW is set
2. The following exceptions are set:
3. FE_INVALID
4. FE_OVERFLOW
数据竞争
每个线程都保持着分离的、拥有自己状态的 浮点环境 。产生一个新线程就复制当前状态。[ 这个适用于 C11 和 C++11 的实现 ]
异常
不抛出异常的保证:这个函数从不抛出异常。
注意 C 浮点环境异常 不是 C++ 异常,因此不能被 try/catch 块捕捉。
调用这个函数的时候,如果编译指示 FENV_ACCESS 关闭的话,则会导致未定义行为。
另请参见
| 函数 | 描述 |
|---|---|
| feraiseexcept | 触发浮点异常 (函数) |
| feclearexcept | 清楚浮点异常 (函数) |
| feholdexcept | 保留浮点异常 (函数) |
