_matherr() Floating-Point Error Handling Routine
#include <math.h>
double _matherr(why,fun,arg1p,arg2p,retval);
_mexcep why; Constants representing math errors
char *fun; Math library function
double *arg1p; Argument that caused the error
double *arg2p; Argument that caused the error
double retval; Return value
_matherr() processes errors generated by math library functions. It
calls matherr() and processes the return value from matherr().
_matherr() should never be called directly by user programs.
Whenever an error occurs in one of the math library routines _matherr
is called with several arguments. _matherr() does four things:
(1) It uses its arguments to fill out an 'exception'
structure. The 'exception' structure (defined in
<math.h>) has the following form:
struct exception {
int type; /* type of math error */
char *name; /* name of math function */
double arg1,arg2; /* arguments that caused errors */
double retval; /* return value */
};
(2) It calls matherr() with 'e', a pointer to the 'exception'
structure, to see if matherr() can resolve the error.
(3) It examines the return value from matherr() as follows:
If matherr() returns 0, (indicating that matherr() was
not able to resolve the error) _matherr() sets 'errno'
(defined in <stdlib.h>). It maps the kind of error that
occurred onto an 'errno' value of either EDOM or ERANGE
and prints an error message.
If matherr() return non-zero, (indicating that matherr()
was able to resolve the error) _matherr is silent; it
does not set 'errno' or print any messages.
(4) It returns 'e->retval' to the original caller. matherr()
might modify 'e->retval' to specify the value it wants
propagated back to the original caller.
Returns: _matherr() returns the value, 'e->retval'. This value is
initially the value of the input parameter 'retval'
passed to _matherr(), and might be modified by matherr().
For math function results greater than MAXDOUBLE (defined
in <values.h>), 'retval' defaults to the macro HUGE_VAL
before being passed to _matherr(). For results less than
MINDOUBLE (defined in <values.h>), 'retval' is set to 0,
then passed to _matherr(). In both of these extremes, if
matherr() does not not modify 'e->retval', _matherr()
sets 'errno' to ERANGE (result out of range).
Seealso:
This page last updated on Fri Nov 30 10:48:32 MSK 2001
Copyright © 1992-2001, Vitaly Filatov, Moscow, Russia
Webmaster