C 库 - fegetenv() 函数

❮ C 标准库 - <fenv.h>


C fenv 库中的 fegetenv() 函数设置了包含小数的数字的控制流。

假设我们正在解决一道数学题,并且正在使用一个可以以不同方式对数字进行舍入的计算器。但是,我们需要切换到另一个具有不同舍入设置的计算器。因此,此函数就像保存了第一个计算器的状态,以便我们稍后可以返回该计算器并使用与之前完全相同的设置继续操作。

语法

以下是 fegetenv() 函数的 C 库语法。

int fegetenv(fenv_t *envp);

参数

此函数仅接受一个参数 -

  • fen_v - 该函数接受一个指向 fenv_t 对象的指针,当前环境变量将存储在该对象中。

返回值

此函数返回整数值,

  • 如果成功,则返回零。

  • 如果无法获取环境变量,则返回非零值。

示例 1

以下是 C 库 fegetenv() 函数,演示了如何保存和恢复浮点数环境。

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

int main() {
    fenv_t env;
    
    // 保存当前浮点环境
    fegetenv(&env);
    
    // 在此处执行一些浮点运算
    fesetenv(&env);
    
    // 恢复已保存的环境
    printf("Floating-point environment restored.");
    return 0;
}

输出

上述代码产生以下结果 -

Floating-point environment restored.

示例 2

在本例中,程序执行了可能导致溢出的操作,恢复了环境并检查是否发生了溢出。

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

// 舍入方向模式
void rounding_mode() 
{ 
   printf("Rounding mode is ->");
   switch (fegetround()) { 
   case FE_TONEAREST: 
     // Round to nearest 
     printf("FE_TONEAREST"); 
     break; 
   case FE_DOWNWARD: 
     // Round downward 
     printf("FE_DOWNWARD"); 
     break; 
   case FE_UPWARD: 
     // Round upward 
     printf("FE_UPWARD"); 
     break; 
   case FE_TOWARDZERO: 
     // Round toward zero 
     printf("FE_TOWARDZERO"); 
     break; 
   default: 
     printf("unknown"); 
   }; 
} 

int main(void) 
{ 
    fenv_t envp; 

    // 初始环境
    printf("Initial environment :"); 

    // 打印最初引发的异常
    printf("Exception raised -> "); 
    if (fetestexcept(FE_ALL_EXCEPT)) { 
        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 "); 
    } 
    else
        printf("None"); 

    // 打印舍入方向模式
    rounding_mode();
    
    // 当前环境
    fegetenv(&envp);
    feraiseexcept(FE_ALL_EXCEPT);
    
    // 设置舍入方向模式
    fesetround(FE_DOWNWARD);
    
    // 环境更改后
    printf("Final environment :"); 
    
    // 打印引发的异常
    printf("Exception raised -> "); 
    if (fetestexcept(FE_ALL_EXCEPT)) { 
        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 "); 
    } 
    else
        printf("None"); 

    // 打印舍入方向模式
    rounding_mode(); 

    return 0; 
}

输出

执行上述代码后,我们得到以下结果 -

Initial environment :
Exception raised -> 
None
Rounding mode is ->FE_TONEAREST

Final environment :
Exception raised -> 
FE_DIVBYZERO 
FE_INEXACT 
FE_INVALID 
FE_OVERFLOW 
FE_UNDERFLOW 
Rounding mode is ->FE_DOWNWARD

❮ C 标准库 - <fenv.h>