|
|
|
Defined in header <math.h> | ||
#define MATH_ERRNO 1 | (since C99) | |
#define MATH_ERREXCEPT 2 | (since C99) | |
#define math_errhandling /*implementation defined*/ | (since C99) | |
The macro constantmath_errhandling
expands to an expression of typeint that is either equal toMATH_ERRNO
, or equal toMATH_ERREXCEPT
, or equal to their bitwise OR (MATH_ERRNO| MATH_ERREXCEPT).
The value ofmath_errhandling
indicates the type of error handling that is performed by the floating-point operators andfunctions:
Constant | Explanation |
MATH_ERREXCEPT | indicates that floating-point exceptions are used: at leastFE_DIVBYZERO,FE_INVALID, andFE_OVERFLOW are defined in<fenv.h> . |
MATH_ERRNO | indicates that floating-point operations use the variableerrno to report errors. |
If the implementation supports IEEE floating-point arithmetic (IEC 60559),math_errhandling& MATH_ERREXCEPT is required to be non-zero.
The following floating-point error conditions are recognized:
Condition | Explanation | errno | floating-point exception | Example |
---|---|---|---|---|
Domain error | the argument is outside the range in which the operation is mathematically defined (the description ofeach function lists the required domain errors) | EDOM | FE_INVALID | acos(2) |
Pole error | the mathematical result of the function is exactly infinite or undefined | ERANGE | FE_DIVBYZERO | log(0.0),1.0/0.0 |
Range error due to overflow | the mathematical result is finite, but becomes infinite after rounding, or becomes the largest representable finite value after rounding down | ERANGE | FE_OVERFLOW | pow(DBL_MAX,2) |
Range error due to underflow | the result is non-zero, but becomes zero after rounding, or becomes subnormal with a loss of precision | ERANGE or unchanged (implementation-defined) | FE_UNDERFLOW or nothing (implementation-defined) | DBL_TRUE_MIN/2 |
Inexact result | the result has to be rounded to fit in the destination type | unchanged | FE_INEXACT or nothing (unspecified) | sqrt(2),1.0/10.0 |
Contents |
WhetherFE_INEXACT is raised by the mathematical library functions is unspecified in general, but may be explicitly specified in the description of the function (e.g.rint vsnearbyint).
Before C99, floating-point exceptions were not specified,EDOM was required for any domain error,ERANGE was required for overflows and implementation-defined for underflows.
#include <stdio.h>#include <fenv.h>#include <math.h>#include <errno.h>#pragma STDC FENV_ACCESS ONint main(void){printf("MATH_ERRNO is %s\n", math_errhandling& MATH_ERRNO?"set":"not set");printf("MATH_ERREXCEPT is %s\n", math_errhandling& MATH_ERREXCEPT?"set":"not set");feclearexcept(FE_ALL_EXCEPT);errno=0;printf("log(0) = %f\n",log(0));if(errno==ERANGE)perror("errno == ERANGE");if(fetestexcept(FE_DIVBYZERO))puts("FE_DIVBYZERO (pole error) reported");}
Possible output:
MATH_ERRNO is setMATH_ERREXCEPT is setlog(0) = -inferrno = ERANGE: Numerical result out of rangeFE_DIVBYZERO (pole error) reported
floating-point exceptions (macro constant)[edit] | |
macro which expands to POSIX-compatible thread-local error number variable (macro variable)[edit] | |
C++ documentation formath_errhandling |