C++ <cfenv> - feholdexcept() Function
The C++ <cfenv> feholdexcept() function first, saves the current floating-point environment to the object pointed to by envp, then resets the current state and if supported puts the environment in non-stop mode. The non-stop mode prevents floating-point exceptions from stopping the normal flow of the program when raised (with traps or abortions). The non-stop mode exists until the floating-point environment is restored by feupdateenv() or fesetenv().
Syntax
int feholdexcept (fenv_t* envp);
Parameters
envp |
Specify pointer to the object of type fenv_t where the floating-point environment will be stored. |
Return Value
Returns 0 on success which includes setting the floating point environment to non-stop mode, non-zero otherwise.
Exception
This function never throws exceptions.
Example:
The example below shows the usage of feholdexcept() function.
#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; feraiseexcept(FE_INEXACT); //displaying the current environment FE_Environment_Message(); //saving and clearing the current environment feholdexcept(&curr_env); //changing the current environment //and displaying it sqrt(-1); fesetround(FE_DOWNWARD); FE_Environment_Message(); //updating current environment with the //previous environment and displaying it feupdateenv(&curr_env); FE_Environment_Message(); return 0; }
The output of the above code will be:
Exceptions raised: FE_INEXACT Current rounding method: TO-NEAREST Exceptions raised: FE_INVALID Current rounding method: DOWNWARD Exceptions raised: FE_INEXACT FE_INVALID Current rounding method: TO-NEAREST
❮ C++ <cfenv> Library