Annotation of 43BSD/usr.lib/libm/README, revision 1.1

1.1     ! root        1: ***************************************************************************
        !             2: *                                                                         * 
        !             3: * Copyright (c) 1985 Regents of the University of California.             *
        !             4: *                                                                         * 
        !             5: * Use and reproduction of this software are granted  in  accordance  with *
        !             6: * the terms and conditions specified in  the  Berkeley  Software  License *
        !             7: * Agreement (in particular, this entails acknowledgement of the programs' *
        !             8: * source, and inclusion of this notice) with the additional understanding *
        !             9: * that  all  recipients  should regard themselves as participants  in  an *
        !            10: * ongoing  research  project and hence should  feel  obligated  to report *
        !            11: * their  experiences (good or bad) with these elementary function  codes, *
        !            12: * using "sendbug 4bsd-bugs@BERKELEY", to the authors.                     *
        !            13: *                                                                         *
        !            14: * K.C. Ng, with Z-S. Alex Liu, S. McDonald, P. Tang, W. Kahan.            *
        !            15: * Revised on 5/10/85, 5/13/85, 6/14/85, 8/20/85, 8/27/85, 9/11/85.        *
        !            16: *                                                                         *
        !            17: ***************************************************************************
        !            18: 
        !            19: /*     @(#)README      1.6 (Berkeley) 9/12/85  */
        !            20: 
        !            21: NB.  The machine-independent Version 7 math library found in 4.2BSD
        !            22:      is now /usr/lib/libom.a.  To compile with those routines use -lom.
        !            23: 
        !            24: ******************************************************************************
        !            25: *  This is a description of the upgraded elementary functions (listed in 1). *
        !            26: *  Bessel functions (j0, j1, jn, y0, y1, yn), floor, and fabs passed over    *
        !            27: *  from 4.2BSD without change except perhaps for the way floating point      *
        !            28: *  exception is signaled on a VAX.  Three lines that contain "errno" in erf.c*
        !            29: *  (error functions erf, erfc) have been deleted to prevent overriding the   *
        !            30: *  system "errno".                                                           *
        !            31: ******************************************************************************
        !            32: 
        !            33: 0. Total number of files: 40
        !            34: 
        !            35:         IEEE/Makefile   VAX/Makefile    VAX/support.s   erf.c       lgamma.c
        !            36:         IEEE/atan2.c    VAX/argred.s    VAX/tan.s       exp.c       log.c
        !            37:         IEEE/cabs.c     VAX/atan2.s     acosh.c         exp__E.c    log10.c
        !            38:         IEEE/cbrt.c     VAX/cabs.s      asincos.c       expm1.c     log1p.c
        !            39:         IEEE/support.c  VAX/cbrt.s      asinh.c         floor.c     log__L.c
        !            40:         IEEE/trig.c     VAX/infnan.s    atan.c          j0.c        pow.c
        !            41:         Makefile        VAX/sincos.s    atanh.c         j1.c        sinh.c
        !            42:         README          VAX/sqrt.s      cosh.c          jn.c        tanh.c
        !            43: 
        !            44: 1. Functions implemented :
        !            45:     (A). Standard elementary functions (total 22) :
        !            46:         acos(x)                 ...in file  asincos.c 
        !            47:         asin(x)                 ...in file  asincos.c
        !            48:         atan(x)                 ...in file  atan.c
        !            49:         atan2(x,y)              ...in files IEEE/atan2.c, VAX/atan2.s
        !            50:         sin(x)                  ...in files IEEE/trig.c,  VAX/sincos.s
        !            51:         cos(x)                  ...in files IEEE/trig.c,  VAX/sincos.s
        !            52:         tan(x)                  ...in files IEEE/trig.c,  VAX/tan.s
        !            53:         cabs(x,y)               ...in files IEEE/cabs.c,  VAX/cabs.s
        !            54:         hypot(x,y)              ...in files IEEE/cabs.c,  VAX/cabs.s
        !            55:         cbrt(x)                 ...in files IEEE/cbrt.c,  VAX/cbrt.s
        !            56:         exp(x)                  ...in file  exp.c
        !            57:         expm1(x):=exp(x)-1      ...in file  expm1.c
        !            58:         log(x)                  ...in file  log.c
        !            59:         log10(x)                ...in file  log10.c
        !            60:         log1p(x):=log(1+x)      ...in file  log1p.c
        !            61:         pow(x,y)                ...in file  pow.c
        !            62:         sinh(x)                 ...in file  sinh.c
        !            63:         cosh(x)                 ...in file  cosh.c
        !            64:         tanh(x)                 ...in file  tanh.c
        !            65:         asinh(x)                ...in file  asinh.c
        !            66:         acosh(x)                ...in file  acosh.c
        !            67:         atanh(x)                ...in file  atanh.c
        !            68:                         
        !            69:     (B). Kernel functions :
        !            70:         exp__E(x,c) ...in file exp__E.c, used by expm1/exp/pow/cosh
        !            71:         log__L(s)   ...in file log__L.c, used by log1p/log/pow
        !            72:         libm$argred ...in file VAX/argred.s, used by VAX version of sin/cos/tan
        !            73: 
        !            74:     (C). System supported functions :
        !            75:         sqrt()      ...in files IEEE/support.c, VAX/sqrt.s
        !            76:         drem()      ...in files IEEE/support.c, VAX/support.s
        !            77:         finite()    ...in files IEEE/support.c, VAX/support.s
        !            78:         logb()      ...in files IEEE/support.c, VAX/support.s
        !            79:         scalb()     ...in files IEEE/support.c, VAX/support.s
        !            80:         copysign()  ...in files IEEE/support.c, VAX/support.s
        !            81:         rint()      ...in file  floor.c
        !            82: 
        !            83: 
        !            84:    Notes: 
        !            85:        i. The codes in files ending with ".s" are written in VAX assembly 
        !            86:           language. They are intended for VAX computers.
        !            87: 
        !            88:           Files that end with ".c" are written in C. They are intended
        !            89:           for either a VAX or a machine that conforms to the IEEE 
        !            90:           standard 754 for double precision floating-point arithmetic.
        !            91: 
        !            92:       ii. On other than VAX or IEEE machines, run the original math 
        !            93:           library, formerly "/usr/lib/libm.a", now "/usr/lib/libom.a", if
        !            94:          nothing better is available.
        !            95: 
        !            96:      iii. The trigonometric functions sin/cos/tan/atan2 in files "VAX/sincos.s",
        !            97:           "VAX/tan.s" and "VAX/atan2.s" are different from those in
        !            98:           "IEEE/trig.c" and "IEEE/atan2.c".  The VAX assembler code uses the
        !            99:           true value of pi to perform argument reduction, while the C code uses
        !           100:           a machine value of PI (see "IEEE/trig.c").
        !           101: 
        !           102: 
        !           103: 2. A computer system that conforms to IEEE standard 754 should provide 
        !           104:                 sqrt(x),
        !           105:                 drem(x,p), (double precision remainder function)
        !           106:                 copysign(x,y),
        !           107:                 finite(x),
        !           108:                 scalb(x,N),
        !           109:                 logb(x) and
        !           110:                 rint(x).
        !           111:    These functions are either required or recommended by the standard.
        !           112:    For convenience, a (slow) C implementation of these functions is 
        !           113:    provided in the file "IEEE/support.c".
        !           114: 
        !           115:    Warning: The functions in IEEE/support.c are somewhat machine dependent.
        !           116:    Some modifications may be necessary to run them on a different machine.
        !           117:    Currently, if compiled with a suitable flag, "IEEE/support.c" will work
        !           118:    on a National 32000, a Zilog 8000, a VAX, and a SUN (cf. the "Makefile"
        !           119:    in this directory). Invoke the C compiler thus:
        !           120: 
        !           121:         cc -c -DVAX IEEE/support.c              ... on a VAX, D-format
        !           122:         cc -c -DNATIONAL IEEE/support.c         ... on a National 32000
        !           123:         cc -c  IEEE/support.c                   ... on other IEEE machines,
        !           124:                                                     we hope.
        !           125: 
        !           126:    Notes: 
        !           127:       1. Faster versions of "drem" and "sqrt" for IEEE double precision
        !           128:          (coded in C but intended for assembly language) are given at the
        !           129:          end of "IEEE/support.c" but commented out since they require certain
        !           130:          machine-dependent functions.
        !           131: 
        !           132:       2. A fast VAX assembler version of the system supported functions
        !           133:          copysign(), logb(), scalb(), finite(), and drem() appears in file 
        !           134:          "VAX/support.s".  A fast VAX assembler version of sqrt() is in
        !           135:          file "VAX/sqrt.s".
        !           136: 
        !           137: 3. Two formats are supported by all the standard elementary functions: 
        !           138:    the VAX D-format (56-bit precision), and the IEEE double format 
        !           139:    (53-bit precision).  The cbrt() in "IEEE/cbrt.c" is for IEEE machines 
        !           140:    only. The functions in files that end with ".s" are for VAX computers 
        !           141:    only. The functions in files that end with ".c" (except "IEEE/cbrt.c")
        !           142:    are for VAX and IEEE machines. To use the VAX D-format, compile the code 
        !           143:    with -DVAX; to use IEEE double format on various IEEE machines, see 
        !           144:    "Makefile" in this directory). 
        !           145: 
        !           146:     Example:
        !           147:         cc -c -DVAX sin.c               ... for VAX D-format
        !           148: 
        !           149:        Warning: The values of floating-point constants used in the code are
        !           150:                 given in both hexadecimal and decimal.  The hexadecimal values
        !           151:                 are the intended ones. The decimal values may be used provided 
        !           152:                 that the compiler converts from decimal to binary accurately
        !           153:                 enough to produce the hexadecimal values shown. If the
        !           154:                 conversion is inaccurate, then one must know the exact machine 
        !           155:                 representation of the constants and alter the assembly
        !           156:                 language output from the compiler, or play tricks like
        !           157:                 the following in a C program.
        !           158: 
        !           159:                         Example: to store the floating-point constant 
        !           160: 
        !           161:                              p1= 2^-6 * .F83ABE67E1066A (Hexadecimal)
        !           162: 
        !           163:                         on a VAX in C, we use two longwords to store its 
        !           164:                         machine value and define p1 to be the double constant 
        !           165:                         at the location of these two longwords:
        !           166: 
        !           167:                         static long  p1x[] = { 0x3abe3d78, 0x066a67e1};
        !           168:                         #define      p1      (*(double*)p1x)
        !           169: 
        !           170:     Note:  On a VAX, some functions have two codes. For example, cabs() has
        !           171:           one implementation in "IEEE/cabs.c", and another in "VAX/cabs.s". 
        !           172:            In this case, the assembly language version is preferred.
        !           173: 
        !           174: 
        !           175: 4. Accuracy. 
        !           176: 
        !           177:             The errors in expm1(), log1p(), exp(), log(), cabs(), hypot()
        !           178:             and cbrt() are below 1 ULP (Unit in the Last Place).
        !           179: 
        !           180:             The error in pow(x,y) grows with the size of y. Nevertheless,
        !           181:             for integers x and y, pow(x,y) returns the correct integer value 
        !           182:             on all tested machines (VAX, SUN, NATIONAL, ZILOG), provided that 
        !           183:             x to the power of y is representable exactly.
        !           184: 
        !           185:             cosh, sinh, acosh, asinh, tanh, atanh and log10 have errors below
        !           186:             about 3 ULPs. 
        !           187: 
        !           188:             For trigonometric and inverse trigonometric functions: 
        !           189: 
        !           190:                 Let [trig(x)] denote the value actually computed for trig(x),
        !           191: 
        !           192:                 1) Those codes using the machine's value PI (true pi rounded):
        !           193:                    (source codes: IEEE/{trig.c,atan2.c}, asincos.c and atan.c)
        !           194: 
        !           195:                    The errors in [sin(x)], [cos(x)], and [atan(x)] are below 
        !           196:                    1 ULP compared with sin(x*pi/PI), cos(x*pi/PI), and 
        !           197:                    atan(x)*PI/pi respectively, where PI is the machine's
        !           198:                    value of pi rounded. [tan(x)] returns tan(x*pi/PI) within
        !           199:                    about 2 ULPs; [acos(x)], [asin(x)], and [atan2(y,x)] 
        !           200:                    return acos(x)*PI/pi, asin(x)*PI/pi, and atan2(y,x)*PI/pi
        !           201:                    respectively to similar accuracy.
        !           202: 
        !           203: 
        !           204:                 2) Those using true pi (for VAX D-format only):
        !           205:                    (source codes: VAX/{sincos.s,tan.s,atan2.s}, asincos.c and
        !           206:                    atan.c)
        !           207: 
        !           208:                    The errors in [sin(x)], [cos(x)], and [atan(x)] are below
        !           209:                    1 ULP. [tan(x)], [atan2(y,x)], [acos(x)], and [asin(x)] 
        !           210:                    have errors below about 2 ULPs. 
        !           211: 
        !           212: 
        !           213:             Here are the results of some test runs to find worst errors on 
        !           214:             the VAX :
        !           215: 
        !           216:     tan   :  2.09 ULPs          ...1,024,000 random arguments (machine PI)
        !           217:     sin   :  .861 ULPs          ...1,024,000 random arguments (machine PI)
        !           218:     cos   :  .857 ULPs          ...1,024,000 random arguments (machine PI)
        !           219:     (compared with tan, sin, cos of (x*pi/PI))
        !           220: 
        !           221:     acos  :  2.07 ULPs          .....200,000 random arguments (machine PI)
        !           222:     asin  :  2.06 ULPs          .....200,000 random arguments (machine PI)
        !           223:     atan2 :  1.41 ULPs          .....356,000 random arguments (machine PI)
        !           224:     atan  :  0.86 ULPs          ...1,536,000 random arguments (machine PI)
        !           225:     (compared with (PI/pi)*(atan, asin, acos, atan2 of x))
        !           226: 
        !           227:     tan   :  2.15 ULPs          ...1,024,000 random arguments (true pi)
        !           228:     sin   :  .814 ULPs          ...1,024,000 random arguments (true pi)
        !           229:     cos   :  .792 ULPs          ...1,024,000 random arguments (true pi)
        !           230:     acos  :  2.15 ULPs          ...1,024,000 random arguments (true pi)
        !           231:     asin  :  1.99 ULPs          ...1,024,000 random arguments (true pi)
        !           232:     atan2 :  1.48 ULPs          ...1,024,000 random arguments (true pi)
        !           233:     atan  :  .850 ULPs          ...1,024,000 random arguments (true pi)
        !           234: 
        !           235:     acosh :  3.30 ULPs          .....512,000 random arguments
        !           236:     asinh :  1.58 ULPs          .....512,000 random arguments
        !           237:     atanh :  1.71 ULPs          .....512,000 random arguments  
        !           238:     cosh  :  1.23 ULPs          .....768,000 random arguments
        !           239:     sinh  :  1.93 ULPs          ...1,024,000 random arguments
        !           240:     tanh  :  2.22 ULPs          ...1,024,000 random arguments
        !           241:     log10 :  1.74 ULPs          ...1,536,000 random arguments
        !           242:     pow   :  1.79 ULPs          .....100,000 random arguments, 0 < x, y < 20.
        !           243:         
        !           244:     exp   :  .768 ULPs          ...1,156,000 random arguments
        !           245:     expm1 :  .844 ULPs          ...1,166,000 random arguments
        !           246:     log1p :  .846 ULPs          ...1,536,000 random arguments
        !           247:     log   :  .826 ULPs          ...1,536,000 random arguments
        !           248:     cabs  :  .959 ULPs          .....500,000 random arguments
        !           249:     cbrt  :  .666 ULPs          ...5,120,000 random arguments
        !           250: 
        !           251: 
        !           252: 5. Speed.
        !           253: 
        !           254:         Some functions coded in VAX assembly language (cabs(), hypot() and
        !           255:        sqrt()) are significantly faster than the corresponding ones in 4.2BSD.
        !           256:         In general, to improve performance, all functions in "IEEE/support.c"
        !           257:         should be written in assembly language and, whenever possible, should
        !           258:        be called via short subroutine calls.
        !           259: 
        !           260: 
        !           261: 6. j0, j1, jn.
        !           262: 
        !           263:         The modifications to these routines were only in how an invalid
        !           264:         floating point operations is signaled.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.