函数
<cfenv>

fetestexcept

int fetestexcept (int excepts);
测试浮点异常
返回 excepts 指定的异常中当前已设置的异常。

返回的值是 excepts 中当前在浮点环境中设置的异常子集的按位或 (bitwise OR) 表示。如果 excepts 中的异常当前都未设置,则返回零。

调用此函数的程序应确保在调用时启用了 pragma FENV_ACCESS

参数

excepts
位掩码值:实现所支持的任意数量的浮点异常值通过按位或(OR)运算的组合。
宏值描述
FE_DIVBYZERO极点错误:除以零,或一些其他渐近无穷大的结果(由有限参数产生)。
FE_INEXACT不精确:结果不精确。
FE_INVALID定义域错误:至少有一个参数是函数未定义的值。
FE_OVERFLOW上溢范围错误:结果的量级太大,无法表示为返回类型的值。
FE_UNDERFLOW下溢范围错误:结果的量级太小,无法表示为返回类型的值。
FE_ALL_EXCEPT所有异常(选择实现支持的所有异常)。
某些库实现可能支持额外的浮点异常值(其对应的宏也以 FE_ 开头)。
库可能仅在 <fenv.h> 中定义它们支持的上述宏值(其他宏可能未定义)。
至少所有上述宏值都在 <cfenv> 中有定义(即使实现不支持)。

返回值

如果 excepts 中的异常都未设置,则为零。
否则,为当前设置的异常(excepts 中的那些)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* fetestexcept example */
#include <stdio.h>      /* puts */
#include <fenv.h>       /* feraiseexcept, fetestexcept, FE_* */
#pragma STDC FENV_ACCESS on

double fn (double x) {
  /* some function for which zero is a domain and range error */
  if (x==0.0) feraiseexcept(FE_INVALID|FE_OVERFLOW);
  return x;
}

int main ()
{
  int fe;

  feclearexcept (FE_ALL_EXCEPT);
  fn (0.0);

  /* testing for single exception: */
  if (fetestexcept(FE_OVERFLOW)) puts ("FE_OVERFLOW is set");

  /* testing multiple exceptions: */
  fe = fetestexcept (FE_ALL_EXCEPT);

  puts ("The following exceptions are set:");
  if (fe & FE_DIVBYZERO) puts ("FE_DIVBYZERO");
  if (fe & FE_INEXACT)   puts ("FE_INEXACT");
  if (fe & FE_INVALID)   puts ("FE_INVALID");
  if (fe & FE_OVERFLOW)  puts ("FE_OVERFLOW");
  if (fe & FE_UNDERFLOW) puts ("FE_UNDERFLOW");

  return 0;
}

可能的输出

FE_OVERFLOW is set
The following exceptions are set:
FE_INVALID
FE_OVERFLOW


数据竞争

每个线程维护一个独立的浮点环境及其自身的状态。生成一个新线程会复制当前状态。[此规定适用于 C11 和 C++11 实现]

异常

无异常保证:此函数从不抛出异常。
请注意,C 语言的浮点异常不是 C++ 异常,因此不能被 try/catch 块捕获。
在 pragma FENV_ACCESS 关闭的情况下调用此函数会导致未定义行为。

另见