Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought



matherr(3M)              UNIX System V(Math Libraries)              matherr(3M)


NAME
      matherr - error-handling function

SYNOPSIS
      cc [flag ...] file ...  -lm [library ...]

      #include <math.h>

      int matherr (struct exception *x);

DESCRIPTION
      matherr is invoked by functions in the math libraries when errors are
      detected.  Note that matherr is not invoked when the -Xc compilation
      option is used.  Users may define their own procedures for handling
      errors, by including a function named matherr in their programs.  matherr
      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.




10/89                                                                    Page 1







matherr(3M)              UNIX System V(Math Libraries)              matherr(3M)


___________________________________________________________________________________
|                        Default Error Handling Procedures                        |
|_____________________|___________________________________________________________|
|                     |                       Types of Errors                     |
|_____________________|________|_______|___________|____________|________|________|
|        type         |  DOMAIN|  SING |  OVERFLOW |  UNDERFLOW |  TLOSS |  PLOSS |
|_____________________|________|_______|___________|____________|________|________|
|        errno        |   EDOM |  EDOM |   ERANGE  |    ERANGE  |  ERANGE|  ERANGE|
|_____________________|________|_______|___________|____________|________|________|
|BESSEL:              |    -   |    -  |      -    |      -     |   M, 0 |    -   |
|y0, y1, yn (arg < 0) |  M, -H |    -  |      -    |      -     |    -   |    -   |
|_____________________|________|_______|___________|____________|________|________|
|EXP, EXPF:           |    -   |    -  |      H    |      0     |    -   |    -   |
|_____________________|________|_______|___________|____________|________|________|
|LOG, LOG10:          |        |       |           |            |        |        |
|LOGF, LOG10F:        |        |       |           |            |        |        |
| (arg < 0)           |  M, -H |    -  |      -    |      -     |    -   |    -   |
| (arg = 0)           |  M, -H |   -   |      -    |      -     |    -   |    -   |
|_____________________|________|_______|___________|____________|________|________|
|POW, POWF:           |    -   |    -  |     +H    |      0     |    -   |    -   |
|neg ** non-int       |  M, 0  |    -  |      -    |      -     |    -   |    -   |
|  0 ** non-pos       |   M, 0 |    -  |      -    |      -     |    -   |    -   |
|_____________________|________|_______|___________|____________|________|________|
|SQRT, SQRTF:         |   M, 0 |    -  |      -    |      -     |    -   |    -   |
|_____________________|________|_______|___________|____________|________|________|
|FMOD, FMODF:         |        |       |           |            |        |        |
| (arg2 = 0)          |   M, X |    -  |      -    |      -     |    -   |    -   |
|_____________________|________|_______|___________|____________|________|________|
|REMAINDER:           |        |       |           |            |        |        |
| (arg2 = 0)          |   M, N |    -  |      -    |      -     |    -   |    -   |
|_____________________|________|_______|___________|____________|________|________|
|GAMMA, LGAMMA:       |    -   |  M, H |      H    |      -     |    -   |    -   |
|_____________________|________|_______|___________|____________|________|________|
|HYPOT:               |    -   |    -  |      H    |      -     |    -   |    -   |
|_____________________|________|_______|___________|____________|________|________|
|SINH, SINHF:         |    -   |    -  |     +H    |      -     |    -   |    -   |
|_____________________|________|_______|___________|____________|________|________|
|COSH, COSHF:         |    -   |    -  |      H    |      -     |    -   |    -   |
|_____________________|________|_______|___________|____________|________|________|
|ASIN, ACOS, ATAN2:   |        |       |           |            |        |        |
|ASINF, ACOSF, ATAN2F:|   M, 0 |    -  |      -    |      -     |    -   |    -   |
|_____________________|________|_______|___________|____________|________|________|
|ACOSH:               |   M, N |    -  |      -    |      -     |    -   |    -   |
|_____________________|________|_______|___________|____________|________|________|
|ATANH:               |        |       |           |            |        |        |
| (|arg| > 1)         |   M, N |    -  |      -    |      -     |    -   |    -   |
| (|arg| = 1)         |    -   |  M, N |      -    |      -     |    -   |    -   |
|_____________________|________|_______|___________|____________|________|________|






Page 2                                                                    10/89







matherr(3M)              UNIX System V(Math Libraries)              matherr(3M)


_______________________________________________________________________________
|                                Abbreviations                                |
|   M            Message is printed (not with the -Xa or -Xc options).        |
|   H            HUGE is returned (HUGE_VAL with the -Xa or -Xc options).     |
|   -H           -HUGE is returned (-HUGE_VAL with the -Xa or -Xc options).   |
|   +H           HUGE or -HUGE is returned.                                   |
|                (HUGE_VAL or -HUGE_VAL with the -Xa or -Xc options).         |
|   0            0 is returned.                                               |
|   X            arg1 is returned.                                            |
|   N            NaN is returned.                                             |
|_____________________________________________________________________________|

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

      int
      matherr(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 (1); /* take no other action */
           }
           return (0); /* all other errors, execute default procedure */
      }

NOTES
      Error handling in -Xa and -Xt modes [see cc(1)] is described more
      completely on individual math library pages.









10/89                                                                    Page 3





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