函数
<cfenv>

feupdateenv

int feupdateenv (const fenv_t* envp);
更新浮点环境
尝试建立由 envp 指向的对象所表示的浮点环境状态。然后尝试引发在调用前已在浮点环境中设置的异常。

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

参数

envp
指向 fenv_t 值的指针(由先前对 fegetenvfeholdexcept 的调用填充),或者是浮点环境宏值之一
描述
FE_DFL_ENV默认浮点环境(与程序启动时相同)。
某些库实现可能支持额外的浮点环境状态值(其对应的宏也以 FE_ 开头)。

返回值

如果成功,则为零。
否则返回一个非零值。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* 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 块捕获。

另见