Home C&C++函数库 c++ 语法 程序源码 Linux C库

fetestexcept

函数   <cfenv>


int fetestexcept (int excepts);

测试浮点异常

返回当前设置的异常,包括由exceptions指定的异常。 返回的值是当前浮点环境中设置的excepts子集的按位OR的结果。如果exceptions中的异常当前没有设置,则为0。
调用这个函数的程序需要确保在本次函数调用时,编译指示FENV_ACCESS已经开启。

☲  参数


excepts

位掩码:实现支持的任意数量浮点异常值的组合(按位或 OR):

宏值 说明
FE_DIVBYZERO 极点错误: 如 :零做除数,或其他一些渐近无限的结果(有限的参数)。
FE_INEXACT 不精确:结果不精确。
FE_INVALID 域错误:至少有一个参数是函数未定义的值。
FE_OVERFLOW 溢出范围错误:结果的值太大,无法用返回类型的值表示。
FE_UNDERFLOW 下溢出范围误差:结果的值太小,不能用返回类型的值表示。
FE_ALL_EXCEPT 所有异常(选择实现支持的所有异常)。

某些库实现可能支持更多的浮点异常值(其对应的宏也以FE_开头)。

C99:
在<fenv.h>中,库可以只定义它们支持的上面的宏值(其他的可能不定义)。

C++11:
至少上面所有的宏值都在<cfenv>中定义(即使实现不支持)。

☉  返回值



如果 excepts中没有设置任何异常,则为零。 否则,当前将设置异常(在 excepts中)。

☣  示例



/* 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块捕获。 如果编译指示FENV_ACCESS关闭,调用这个函数会导致未定义的行为。

🍄  另请参阅



feraiseexcept 触发浮点异常(function )
feclearexcept 清除浮点异常(function )
feholdexcept 保留浮点异常(function )


联系我们 免责声明 关于CandCplus 网站地图