_matherr

Handles math errors.

int _matherr( struct _exception *except );

Routine Required Header Compatibility
_matherr <math.h> Win 95, Win NT

For additional compatibility information, see Compatibility in the Introduction.

Libraries

LIBC.LIB Single thread static library, retail version
LIBCMT.LIB Multithread static library, retail version
MSVCRT.LIB Import library for MSVCRT.DLL, retail version

Return Value

_matherr returns 0 to indicate an error or a non-zero value to indicate success. If _matherr returns 0, an error message can be displayed, and errno is set to an appropriate error value. If _matherr returns a nonzero value, no error message is displayed, and errno remains unchanged.

Parameter

except

Pointer to structure containing error information

Remarks

The _matherr function processes errors generated by the floating-point functions of the math library. These functions call _matherr when an error is detected.

For special error handling, you can provide a different definition of _matherr. If you use the dynamically linked version of the C run-time library (MSVCRT.DLL), you can replace the default _matherr routine in a client executable with a user-defined version. However, you cannot replace the default _matherr routine in a DLL client of MSVCRT.DLL.

When an error occurs in a math routine, _matherr is called with a pointer to an _exception type structure (defined in MATH.H) as an argument. The _exception structure contains the following elements:

int type

Exception type

char *name

Name of function where error occurred

double arg1, arg2

First and second (if any) arguments to function

double retval

Value to be returned by function

The type specifies the type of math error. It is one of the following values, defined in MATH.H:

_DOMAIN

Argument domain error.

_SING

Argument singularity.

_OVERFLOW

Overflow range error.

_PLOSS

Partial loss of significance.

_TLOSS

Total loss of significance.

_UNDERFLOW

The result is too small to be represented. (This condition is not currently supported.)

The structure member name is a pointer to a null-terminated string containing the name of the function that caused the error. The structure members arg1 and arg2 specify the values that caused the error. (If only one argument is given, it is stored in arg1.)

The default return value for the given error is retval. If you change the return value, it must specify whether an error actually occurred.

Example

/* MATHERR.C illustrates writing an error routine for math 
 * functions. The error function must be:
 *      _matherr
 */

#include <math.h>
#include <string.h>
#include <stdio.h>

void main()
{
    /* Do several math operations that cause errors. The _matherr
     * routine handles _DOMAIN errors, but lets the system handle
     * other errors normally.
     */
    printf( "log( -2.0 ) = %e\n", log( -2.0 ) );
    printf( "log10( -5.0 ) = %e\n", log10( -5.0 ) );
    printf( "log( 0.0 ) = %e\n", log( 0.0 ) );
}

/* Handle several math errors caused by passing a negative argument
 * to log or log10 (_DOMAIN errors). When this happens, _matherr
 * returns the natural or base-10 logarithm of the absolute value
 * of the argument and suppresses the usual error message.
 */
int _matherr( struct _exception *except )
{
    /* Handle _DOMAIN errors for log or log10. */
    if( except->type == _DOMAIN )
    {
        if( strcmp( except->name, "log" ) == 0 )
        {
            except->retval = log( -(except->arg1) );
            printf( "Special: using absolute value: %s: _DOMAIN "
                     "error\n", except->name );
            return 1;
        }
        else if( strcmp( except->name, "log10" ) == 0 )
        {
            except->retval = log10( -(except->arg1) );
            printf( "Special: using absolute value: %s: _DOMAIN "
                     "error\n", except->name );
            return 1;
        }
    }
    else
    {
        printf( "Normal: " );
        return 0;    /* Else use the default actions */
    }
}

Output

Special: using absolute value: log: _DOMAIN error
log( -2.0 ) = 6.931472e-001
Special: using absolute value: log10: _DOMAIN error
log10( -5.0 ) = 6.989700e-001
Normal: log( 0.0 ) = -1.#INF00e+000

Floating-Point Support RoutinesLong Double Routines