C 库 - fegetenv() 函数



C 的fenvfegetenv() 函数设置带小数的数字的控制流程。

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

语法

以下是 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;
   
   // Save the current floating-point environment
   fegetenv(&env); 
   
   // Perform some floating-point operations here
   fesetenv(&env); 
   
   // Restore the saved environment
   printf("Floating-point environment restored.\n");
   return 0;
}

输出

以上代码产生以下结果:

Floating-point environment restored.

示例 2

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

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

// rounding direction mode 
void rounding_mode() 
{ 
   printf("Rounding mode is ->");
   switch (fegetround()) { 
   case FE_TONEAREST: 
     // Round to nearest 
     printf("FE_TONEAREST\n"); 
     break; 
   case FE_DOWNWARD: 
     // Round downward 
     printf("FE_DOWNWARD\n"); 
     break; 
   case FE_UPWARD: 
     // Round upward 
     printf("FE_UPWARD\n"); 
     break; 
   case FE_TOWARDZERO: 
     // Round toward zero 
     printf("FE_TOWARDZERO\n"); 
     break; 
   default: 
     printf("unknown\n"); 
   }; 
} 

int main(void) 
{ 
    fenv_t envp; 

    // initial environment 
    printf("Initial environment :\n"); 

    // print the exception raised initially 
    printf("Exception raised -> \n"); 
    if (fetestexcept(FE_ALL_EXCEPT)) { 
        if (fetestexcept(FE_DIVBYZERO)) 
            printf("FE_DIVBYZERO \n"); 
        if (fetestexcept(FE_INEXACT)) 
            printf("FE_INEXACT \n"); 
        if (fetestexcept(FE_INVALID)) 
            printf("FE_INVALID \n"); 
        if (fetestexcept(FE_OVERFLOW)) 
            printf("FE_OVERFLOW \n"); 
        if (fetestexcept(FE_UNDERFLOW)) 
            printf("FE_UNDERFLOW \n"); 
    } 
    else
        printf("None\n"); 

    // print the rounding direction mode 
    rounding_mode(); 

    // Current environment 
    fegetenv(&envp); 
    feraiseexcept(FE_ALL_EXCEPT); 

    // Set rounding direction mode 
    fesetround(FE_DOWNWARD); 

    // after environment is change 
    printf("\nFinal environment :\n"); 

    // print the exception raised 
    printf("Exception raised -> \n"); 
    if (fetestexcept(FE_ALL_EXCEPT)) { 
        if (fetestexcept(FE_DIVBYZERO)) 
            printf("FE_DIVBYZERO \n"); 
        if (fetestexcept(FE_INEXACT)) 
            printf("FE_INEXACT \n"); 
        if (fetestexcept(FE_INVALID)) 
            printf("FE_INVALID \n"); 
        if (fetestexcept(FE_OVERFLOW)) 
            printf("FE_OVERFLOW \n"); 
        if (fetestexcept(FE_UNDERFLOW)) 
            printf("FE_UNDERFLOW \n"); 
    } 
    else
        printf("None\n"); 

    // print the rounding direction mode 
    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_library_fenv_h.htm
广告