函式
<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 塊捕獲。

另見