| Functions | ||||
(C99) | ||||
(C99) | ||||
(C99) | ||||
(C99)(C99) | ||||
(C99)(C99) | ||||
(C99) | ||||
feholdexcept (C99) | ||||
(C99) | ||||
| Macro constants | ||||
(C99) |
Defined in header <fenv.h> | ||
int feholdexcept( fenv_t* envp); | (since C99) | |
First, saves the current floating-point environment to the object pointed to byenvp (similar tofegetenv), then clears all floating-point status flags, and then installs the non-stop mode: future floating-point exceptions will not interrupt execution (will not trap), until the floating-point environment is restored byfeupdateenv orfesetenv.
This function may be used in the beginning of a subroutine that must hide the floating-point exceptions it may raise from the caller. If only some exceptions must be suppressed, while others must be reported, the non-stop mode is usually ended with a call tofeupdateenv after clearing the unwanted exceptions.
Contents |
| envp | - | pointer to the object of typefenv_t where the floating-point environment will be stored |
0 on success, non-zero otherwise.
#include <stdio.h>#include <fenv.h>#include <float.h> #pragma STDC FENV_ACCESS ON void show_fe_exceptions(void){printf("current 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");} double x2(double x)/* times two */{ fenv_t curr_excepts; /* Save and clear current f-p environment. */ feholdexcept(&curr_excepts); /* Raise inexact and overflow exceptions. */printf("In x2(): x = %f\n", x=x*2.0); show_fe_exceptions();feclearexcept(FE_INEXACT);/* hide inexact exception from caller */ /* Merge caller's exceptions (FE_INVALID) *//* with remaining x2's exceptions (FE_OVERFLOW). */feupdateenv(&curr_excepts);return x;} int main(void){feclearexcept(FE_ALL_EXCEPT);feraiseexcept(FE_INVALID);/* some computation with invalid argument */ show_fe_exceptions();printf("x2(DBL_MAX) = %f\n", x2(DBL_MAX)); show_fe_exceptions(); return0;}
Output:
current exceptions raised: FE_INVALIDIn x2(): x = infcurrent exceptions raised: FE_INEXACT FE_OVERFLOWx2(DBL_MAX) = infcurrent exceptions raised: FE_INVALID FE_OVERFLOW
(C99) | restores the floating-point environment and raises the previously raise exceptions (function)[edit] |
(C99) | saves or restores the current floating-point environment (function)[edit] |
(C99) | default floating-point environment (macro constant)[edit] |
C++ documentation forfeholdexcept | |