Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ matherr(S) — OpenDesktop Software Development System 1.0.0d

Media Vault

Software Library

Restoration Projects

Artifacts Sought



     MATHERR(S)                UNIX System V                MATHERR(S)



     Name
          matherr - error-handling function

     Syntax
          #include <math.h>

          int matherr (x)
          struct exception *x;

     Description
          The matherr function is invoked by functions in the Math
          Library when errors are detected.  Users may define their
          own procedures for handling errors by including a function
          named matherr in their programs.  The matherr function must
          be of the form described above.  When an error occurs, a
          pointer to the exception structure x will be passed to the
          user-supplied matherr function.  This structure, which is
          defined in the <math.h> header file, is as follows:

          struct exception {
               int type;
               char *name;
               double arg1, arg2, retval;
          };

          The element type is an integer describing the type of error
          that has occurred, from the following list of constants
          (defined in the header file):

               DOMAIN     argument domain error
               SING       argument singularity
               OVERFLOW   overflow range error
               UNDERFLOW  underflow range error
               TLOSS      total loss of significance
               PLOSS      partial loss of significance

          The element name points to a string containing the name of
          the function that incurred the error.  The variables arg1
          and arg2 are the arguments with which the function was
          invoked.  retval is set to the default value that will be
          returned by the function unless the user's matherr sets it
          to a different value.

          If the user's matherr function returns non-zero, no error
          message will be printed, and errno will not be set.

          If matherr is not supplied by the user, the default error-
          handling procedures, described with the math functions
          involved, will be invoked upon error.  These procedures are
          also summarized in the table below.  In every case, errno is
          set to EDOM or ERANGE and the program continues.

     Example
          #include <math.h>

          int
          matherr(x)
          register struct exception *x;
          {
               switch (x->type) {
               case DOMAIN:
                    /* change sqrt to return sqrt(-arg1), not 0 */
                    if (!strcmp(x->name, "sqrt")) {
                         x->retval = sqrt(-x->arg1);
                         return (0); /* print message and set errno */
                    }
               case SING:
                    /* all other domain or sing errors,
                        print message and abort */
                    fprintf(stderr, "domain error in %s\n", x->name);
                    abort( );
               case PLOSS:
                    /* print detailed error message */
                    fprintf(stderr, "loss of significance in %s(%g) = %g\n",
                         x->name, x->arg1, x->retval);
                    return (C); /* take no other action */
               }
               return (0); /* all other errors, execute default procedure */
          }

                        DEFAULT ERROR HANDLING PROCEDURES
       ___________________________________________________________________
                             Types of Errors
       ___________________________________________________________________
                type           DOMAIN SING OVERFLOW UNDERFLOW TLOSS PLOSS
       ___________________________________________________________________
                errno           EDOM  EDOM  ERANGE    ERANGE  ERANGEERANGE
       ___________________________________________________________________
       BESSEL:                   -     -       -        -      M, 0   *
       y0, y1, yn (arg _ 0)    M, -H   -       -        -       -     -
       ___________________________________________________________________
       EXP:                      -     -       H        0       -     -
       ___________________________________________________________________
       LOG, LOG10:
        (arg < 0)              M, -H   -       -        -       -     -
        (arg = 0)                -   M, -H     -        -       -     -
       ___________________________________________________________________
       POW:                      -     -      _H        0       -     -
       neg ** non-int          M, 0    -       -        -       -     -
         0 ** non-pos
       ___________________________________________________________________
       SQRT:                   M, 0    -       -        -       -     -
       ___________________________________________________________________
       GAMMA:                    -    M, H     H        -       -     -
       ___________________________________________________________________
       HYPOT:                    -     -       H        -       -     -
       ___________________________________________________________________
       SINH:                     -     -      _H        -       -     -
       ___________________________________________________________________
       COSH:                     -     -       H        -       -     -
       ___________________________________________________________________
       SIN, COS, TAN: -          -     -       -       M, 0     *
       ___________________________________________________________________
       ASIN, ACOS, ATAN2: M, 0   -     -       -        -       -

         ABBREVIATIONS:   *    As much as possible of the value is returned.
                          M    Message is printed (EDOM error).
                          H    HUGE is returned.
                          -H   -HUGE is returned.
                          _H   HUGE or -HUGE is returned.
                          0    0 is returned.

     Standards Conformance
          matherr is conformant with:
          AT&T SVID Issue 2, Select Code 307-127;
          and The X/Open Portability Guide II of January 1987.

                                             (printed 6/20/89)



Typewritten Software • bear@typewritten.org • Edmonds, WA 98026