Annotation of 43BSDTahoe/usr.lib/libm/README, revision 1.1.1.1

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