Next: modf, Previous: lround, Up: Math

### 1.41 `matherr`—modifiable math error handler

Synopsis

         #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:

`type`
  The type of mathematical error that occured; macros encoding error types are also defined in ``math.h`'.
`name`
  a pointer to a null-terminated string holding the name of the math library function where the error occurred.
`arg1, arg2`
  The arguments which caused the error.
`retval`
  The error return value (what the calling function will return).
`err`
  If 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:

`DOMAIN`
  An argument was not in the domain of the function; e.g. `log(-1.0)`.
`SING`
  The requested calculation would result in a singularity; e.g. `pow(0.0,-2.0)`
`OVERFLOW`
  A calculation would produce a result too large to represent; e.g. `exp(1000.0)`.
`UNDERFLOW`
  A calculation would produce a result too small to represent; e.g. `exp(-1000.0)`.
`TLOSS`
  Total loss of precision. The result would have no significant digits; e.g. `sin(10e70)`.
`PLOSS`
  Partial 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.