matherr—modifiable math error handlerSynopsis
#include <math.h> int matherr(struct exception *e);
Description
matherr is called whenever a math library function generates an error.
You can replace matherr by your own subroutine to customize
error treatment. The customized matherr must return 0 if
it fails to resolve the error, and non-zero if the error is resolved.
When matherr returns a nonzero value, no error message is printed
and the value of errno is not modified. You can accomplish either
or both of these things in your own matherr using the information
passed in the structure *e.
This is the exception structure (defined in ‘math.h’):
struct exception {
int type;
char *name;
double arg1, arg2, retval;
int err;
};
The members of the exception structure have the following meanings:
typeThe type of mathematical error that occured; macros encoding error
types are also defined in ‘math.h’.
namea pointer to a null-terminated string holding the name of the math library function where the error occurred.
arg1, arg2The arguments which caused the error.
retvalThe error return value (what the calling function will return).
errIf set to be non-zero, this is the new value assigned to errno.
The error types defined in ‘math.h’ represent possible mathematical
errors as follows:
DOMAINAn argument was not in the domain of the function; e.g. log(-1.0).
SINGThe requested calculation would result in a singularity; e.g. pow(0.0,-2.0)
OVERFLOWA calculation would produce a result too large to represent; e.g.
exp(1000.0).
UNDERFLOWA calculation would produce a result too small to represent; e.g.
exp(-1000.0).
TLOSSTotal loss of precision. The result would have no significant digits;
e.g. sin(10e70).
PLOSSPartial loss of precision.
Returns
The library definition for matherr returns 0 in all cases.
You can change the calling function’s result from a customized matherr
by modifying e->retval, which propagates backs to the caller.
If matherr returns 0 (indicating that it was not able to resolve
the error) the caller sets errno to an appropriate value, and prints
an error message.
Portability
matherr is not ANSI C.