Next: modf, Previous: lround, Up: Math [Contents][Index]

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

Next: modf, Previous: lround, Up: Math [Contents][Index]