Contents|Index|Previous|Next

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. The following example shows 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 occurred; 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.

COMPLIANCE

matherr is not ANSI C.