C++ <cfenv> - fenv_t Type
The C++ <cfenv> 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 <iostream> #include <cfenv> #include <cmath> #pragma STDC FENV_ACCESS ON using namespace std; void FE_Exceptions_Message(void) { cout<<"Exceptions raised:"; if(fetestexcept(FE_DIVBYZERO)) cout<<" FE_DIVBYZERO"; if(fetestexcept(FE_INEXACT)) cout<<" FE_INEXACT"; if(fetestexcept(FE_INVALID)) cout<<" FE_INVALID"; if(fetestexcept(FE_OVERFLOW)) cout<<" FE_OVERFLOW"; if(fetestexcept(FE_UNDERFLOW)) cout<<" FE_UNDERFLOW"; if(fetestexcept(FE_ALL_EXCEPT) == 0) cout<<" None"; cout<<endl; } void Rounding_Direction_Message(void) { cout<<"Current rounding method: "; switch(fegetround()) { case FE_DOWNWARD: cout<<"DOWNWARD"; break; case FE_TONEAREST: cout<<"TO-NEAREST"; break; case FE_TOWARDZERO: cout<<"TOWARD-ZERO"; break; case FE_UPWARD: cout<<"UPWARD"; break; default: cout<<"unknown"; } cout<<endl; } void FE_Environment_Message(void) { FE_Exceptions_Message(); Rounding_Direction_Message(); cout<<endl; } 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++ <cfenv> Library