# feupdateenv

< c‎ | numeric‎ | fenv

定义于头文件 `<fenv.h>` |  |
int feupdateenv( const fenv_t* envp ); |  | (C99 起)

首先，回忆当前引发的浮点异常，然后从 `envp` 所指向的对象恢复浮点环境（类似 fesetenv ），再引发保存的浮点异常。

此函数可用于结束先前调用 feholdexcept 建立的不停止模式。

### 参数

envp | - | 指向 fenv_t 类型对象的指针，对象为之前到 feholdexcept 或 `fegetenv` 的调用所设，或等于 FE_DFL_ENV

### 返回值

成功时为 ​0​ ，否则为非零。

### 示例

    #include <stdio.h>
    #include <fenv.h>
    #include <float.h>

    #pragma STDC FENV_ACCESS ON

    void show_fe_exceptions(void)
    {
        printf("current exceptions raised: ");
        if(fetestexcept(FE_DIVBYZERO))     printf(" FE_DIVBYZERO");
        if(fetestexcept(FE_INEXACT))       printf(" FE_INEXACT");
        if(fetestexcept(FE_INVALID))       printf(" FE_INVALID");
        if(fetestexcept(FE_OVERFLOW))      printf(" FE_OVERFLOW");
        if(fetestexcept(FE_UNDERFLOW))     printf(" FE_UNDERFLOW");
        if(fetestexcept(FE_ALL_EXCEPT)==0) printf(" none");
        printf("\n");
    }

    double x2 (double x)   /* 乘二 */
    {
        fenv_t curr_excepts;

        /* 保存并清理当前浮点环境。 */
        feholdexcept(&curr_excepts);

        /* 引发不准确和溢出异常。 */
        printf("In x2():  x = %f\n", x=x*2.0);
        show_fe_exceptions();
        feclearexcept(FE_INEXACT);   /* 从调用方隐藏不准确异常 */

        /* 将调用方的异常（FE_INVALID）并入        */
        /* 剩下的x2的异常（FE_OVERFLOW）。 */
        feupdateenv(&curr_excepts);
        return x;
    }

    int main(void)
    {
        feclearexcept(FE_ALL_EXCEPT);
        feraiseexcept(FE_INVALID);   /* 一些带有非法参数的计算 */
        show_fe_exceptions();
        printf("x2(DBL_MAX) = %f\n", x2(DBL_MAX));
        show_fe_exceptions();

        return 0;
    }

输出：

    current exceptions raised:  FE_INVALID
    In x2():  x = inf
    current exceptions raised:  FE_INEXACT FE_OVERFLOW
    x2(DBL_MAX) = inf
    current exceptions raised:  FE_INVALID FE_OVERFLOW

### 引用

- C11 标准（ISO/IEC 9899:2011）：

  - 7.6.4.4 The feupdateenv function (p: 214-215)

- C99 标准（ISO/IEC 9899:1999）：

  - 7.6.4.4 The feupdateenv function (p: 195-196)

### 参阅

feholdexcept (C99) | 保存当前环境的异常状态标志，再清除所有异常状态标志，并忽略所有未来错误 (函数)
fegetenv fesetenv (C99)(C99) | 保存或恢复当前浮点环境，包括异常的标志和数字的舍弃模式 (函数)
FE_DFL_ENV (C99) | 默认浮点环境 (宏常量)