C Standard Library

C <fenv.h> - fenv_t Type



The C <fenv.h> fenv_t type representing the entire floating-point environment, including its floating-point status flags (such as the active floating-point exceptions) and control modes (such as the rounding direction mode) supported by the implementation. Its value will be set by calling either fegetenv() or feholdexcept(), and can be applied by calling fesetenv() or feupdateenv().

Example:

The example below shows the usage of fenv_t type.

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

#pragma STDC FENV_ACCESS ON

void FE_Exceptions_Message(void) {
  printf("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");
}

void Rounding_Direction_Message(void) {
  printf("Current rounding method: ");
  switch(fegetround()) {
    case FE_DOWNWARD: 
      printf("DOWNWARD"); break;
    case FE_TONEAREST:   
      printf("TO-NEAREST"); break;
    case FE_TOWARDZERO:   
      printf("TOWARD-ZERO"); break;
    case FE_UPWARD:  
      printf("UPWARD"); break;
    default:
      printf("unknown");
  }
  printf("\n");
}

void FE_Environment_Message(void) {
  FE_Exceptions_Message();
  Rounding_Direction_Message();
  printf("\n");
}  

int main (){
  //creating fenv_t object
  fenv_t curr_env; 

  //displaying the current environment
  FE_Environment_Message();

  //storing the current environment
  fegetenv(&curr_env);

  //changing the current environment
  //and displaying it
  sqrt(-1);
  fesetround(FE_DOWNWARD);
  FE_Environment_Message();

  //restoring the previous environment
  //and displaying it
  fesetenv(&curr_env);
  FE_Environment_Message();

  return 0;
}

The output of the above code will be:

Exceptions raised: None
Current rounding method: TO-NEAREST

Exceptions raised: FE_INVALID
Current rounding method: DOWNWARD

Exceptions raised: None
Current rounding method: TO-NEAREST

❮ C <fenv.h> Library

5