function
<cfenv>
feholdexcept
int feholdexcept (fenv_t* envp);
Hold floating-point exceptions
Saves the current state of the floating-point environment in the object pointed by envp. It 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).
Programs calling this function shall ensure that pragma FENV_ACCESS is enabled for the call.
Parameters
- envp
- Pointer to a fenv_t object where the state of the floating-point environment is stored.
Return Value
Zero, if the function completed successfully, including setting the floating point environment to non-stop mode.
A non-zero value otherwise.
Example
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | /* feholdexcept/feupdateenv example */
#include <stdio.h>      /* printf, puts */
#include <fenv.h>       /* feholdexcept, feclearexcept, fetestexcept, feupdateenv, FE_* */
#include <math.h>       /* log */
#pragma STDC FENV_ACCESS on
double log_zerook (double x) {
  fenv_t fe;
  feholdexcept(&fe);
  x=log(x);
  feclearexcept (FE_OVERFLOW|FE_DIVBYZERO);
  feupdateenv(&fe);
  return x;
}
int main ()
{
  feclearexcept (FE_ALL_EXCEPT);
  printf ("log(0.0): %f\n", log_zerook(0.0));
  if (!fetestexcept(FE_ALL_EXCEPT))
    puts ("no exceptions raised");
  return 0;
}
 | 
Possible output:
| 
log(0.0): -inf
no exceptions raised
 | 
Data races
Each thread maintains a separate floating-point environment with its own state. Spawning a new thread copies the current state. [This applies to C11 and C++11 implementations]
Exceptions
No-throw guarantee: this function never throws exceptions.
Note that C floating-point exceptions are not C++ exceptions, and thus are not caught by try/catch blocks.
See also
- fegetenv
- Get floating-point environment (function
)
- fesetenv
- Set floating-point environment (function
)
- feclearexcept
- Clear floating-point exceptions (function
)