fetestexcept()
tests for the floating-point exceptions that have been raised at any given moment in a program’s execution. It is defined in the cfenv
header along with the floating-point exception macros.
To use fetestexcept()
, the program must enable the pragma
FENV_ACCESS
as shown below:
#pragma STDC FENV_ACCESS on
int fetestexcept (int excepts);
except
: a bitmask of type int
which specifies the floating-point exceptions to test for.
fetestexcept()
returns bitwise OR
of the floating point exceptions that are currently set and the bitmask provided as the argument.
Macro | Description |
FE_DIVBYZERO | the result of a computation with finite arguments is infinite (division by zero occurs) |
FE_INEXACT | the result of a computation can not be represented with exact accuracy |
FE_INVALLID | the function is undefined for at least one of the given arguments |
FE_OVERFLOW | the resulting value is too large to be represented by a floating point value |
FE_UNDERFLOW | the resulting value is too small to be represented by a floating point value |
FE_ALL_EXCEPT | at least one of the above exceptions are raised |
#include <iostream>#include <cmath>#include <cfenv>#pragma STDC FENV_ACCESS onint main(){float x = 1.0 / 0.0;float y = std::sqrt(-1);std::cout << "The floating point exceptions currently raised are: " << std::endl;if (std::fetestexcept(FE_DIVBYZERO)) std::cout << "FE_DIVBYZERO raised" << std::endl;if (std::fetestexcept(FE_INEXACT)) std::cout << "FE_INEXACT raised" << std::endl;if (std::fetestexcept(FE_INVALID)) std::cout << "FE_INVALID raised" << std::endl;if (std::fetestexcept(FE_OVERFLOW)) std::cout << "FE_OVERFLOW raised" << std::endl;if (std::fetestexcept(FE_UNDERFLOW)) std::cout << "FE_UNDERFLOW raised" << std::endl;if (std::fetestexcept(FE_ALL_EXCEPT)) std::cout << "FE_ALL_EXCEPT raised" << std::endl;elsestd::cout << "**No exceptions raised**" << std::endl;return 0;}
In the code above, we trigger the FE_DIVBYZERO
and the FE_INVALID
exceptions to be set.
FE_DIVBYZERO
is raised when we try to compute the result of , which is undefined. As a result, it raises the FE_DIVBYZERO
exception.
FE_INVALID
is raised when we try to compute the square root of . Since the square root is only defined for positive values, it raises the FE_INVALID
exception.
Free Resources