4.4BSD/usr/share/man/cat3/math.0

Compare this file to the similar file:
Show the results in this format:




MATH(3)              BSD Programmer's Manual              MATH(3)


NNAAMMEE
       math - introduction to mathematical library functions

DDEESSCCRRIIPPTTIIOONN
       These  functions constitute the C math library, _l_i_b_m_.  The
       link editor searches this library under the "-lm"  option.
       Declarations  for these functions may be obtained from the
       include  file  <_m_a_t_h_._h>.   The  Fortran  math  library  is
       described in ``man 3f intro''.

LLIISSTT OOFF FFUUNNCCTTIIOONNSS
       _N_a_m_e      _A_p_p_e_a_r_s _o_n _P_a_g_e    _D_e_s_c_r_i_p_t_i_o_n               _E_r_r_o_r _B_o_u_n_d _(_U_L_P_s_)
       acos        sin.3m       inverse trigonometric function      3
       acosh       asinh.3m     inverse hyperbolic function         3
       asin        sin.3m       inverse trigonometric function      3
       asinh       asinh.3m     inverse hyperbolic function         3
       atan        sin.3m       inverse trigonometric function      1
       atanh       asinh.3m     inverse hyperbolic function         3
       atan2       sin.3m       inverse trigonometric function      2
       cabs        hypot.3m     complex absolute value              1
       cbrt        sqrt.3m      cube root                           1
       ceil        floor.3m     integer no less than                0
       copysign    ieee.3m      copy sign bit                       0
       cos         sin.3m       trigonometric function              1
       cosh        sinh.3m      hyperbolic function                 3
       drem        ieee.3m      remainder                           0
       erf         erf.3m       error function                     ???
       erfc        erf.3m       complementary error function       ???
       exp         exp.3m       exponential                         1
       expm1       exp.3m       exp(x)-1                            1
       fabs        floor.3m     absolute value                      0
       floor       floor.3m     integer no greater than             0
       hypot       hypot.3m     Euclidean distance                  1
       infnan      infnan.3m    signals exceptions
       j0          j0.3m        bessel function                    ???
       j1          j0.3m        bessel function                    ???
       jn          j0.3m        bessel function                    ???
       lgamma      lgamma.3m    log gamma function; (formerly gamma.3m)
       log         exp.3m       natural logarithm                   1
       logb        ieee.3m      exponent extraction                 0
       log10       exp.3m       logarithm to base 10                3
       log1p       exp.3m       log(1+x)                            1
       pow         exp.3m       exponential x**y                 60-500
       rint        floor.3m     round to nearest integer            0
       scalb       ieee.3m      exponent adjustment                 0
       sin         sin.3m       trigonometric function              1
       sinh        sinh.3m      hyperbolic function                 3
       sqrt        sqrt.3m      square root                         1
       tan         sin.3m       trigonometric function              3
       tanh        sinh.3m      hyperbolic function                 3
       y0          j0.3m        bessel function                    ???



4th Berkeley Distribution  June 4, 1993                         1








MATH(3)              BSD Programmer's Manual              MATH(3)


       y1          j0.3m        bessel function                    ???
       yn          j0.3m        bessel function                    ???

NNOOTTEESS
       In  4.3 BSD, distributed from the University of California
       in late 1985, most of the foregoing functions come in  two
       versions,  one  for the double-precision "D" format in the
       DEC  VAX-11  family  of  computers,   another   for   dou-
       ble-precision  arithmetic  conforming to the IEEE Standard
       754 for Binary Floating-Point Arithmetic.   The  two  ver-
       sions  behave  very  similarly, as should be expected from
       programs more accurate and robust than was the  norm  when
       UNIX was born.  For instance, the programs are accurate to
       within the numbers of _u_l_ps tabulated above; an _u_l_p is  one
       _Unit  in the _Last _Place.  And the programs have been cured
       of anomalies that afflicted the older math library _l_i_b_m in
       which incidents like the following had been reported:
              sqrt(-1.0) = 0.0 and log(-1.0) = -1.7e38.
              cos(1.0e-11) > cos(0.0) > 1.0.
              pow(x,1.0) != x when x = 2.0, 3.0, 4.0, ..., 9.0.
              pow(-1.0,1.0e10) trapped on Integer Overflow.
              sqrt(1.0e30) and sqrt(1.0e-30) were very slow.
       However the two versions do differ in ways that have to be
       explained, to which end the following notes are  provided.

       DDEECC VVAAXX--1111 DD__ffllooaattiinngg--ppooiinntt::

       This  is  the  format  for which the original math library
       _l_i_b_m was developed, and to  which  this  manual  is  still
       principally  dedicated.  It is _t_h_e double-precision format
       for the PDP-11 and the earlier  VAX-11  machines;  VAX-11s
       after  1983  were  provided  with  an  optional "G" format
       closer to the IEEE double-precision format.   The  earlier
       DEC  MicroVAXs  have no D format, only G double-precision.
       (Why?  Why not?)

       Properties of D_floating-point:
              Wordsize: 64 bits, 8 bytes.  Radix: Binary.
              Precision: 56 sig.   bits,  roughly  like  17  sig.
              decimals.
                     If   x   and  x'  are  consecutive  positive
                     D_floating-point numbers (they differ  by  1
                     _u_l_p), then
                     1.3e-17  <  0.5**56  < (x'-x)/x <= 0.5**55 <
                     2.8e-17.
              Range: Overflow threshold  = 2.0**127 = 1.7e38.
                     Underflow threshold = 0.5**128 = 2.9e-39.
                     NOTE:  THIS RANGE IS COMPARATIVELY NARROW.
                     Overflow customarily stops computation.
                     Underflow is customarily flushed quietly  to
                     zero.



4th Berkeley Distribution  June 4, 1993                         2








MATH(3)              BSD Programmer's Manual              MATH(3)


                     CAUTION:
                             It  is  possible  to have x != y and
                             yet x-y = 0  because  of  underflow.
                             Similarly  x  > y > 0 cannot prevent
                             either x*y = 0 or  y/x = 0 from hap-
                             pening without warning.
              Zero is represented ambiguously.
                     Although  2**55 different representations of
                     zero are accepted by the hardware, only  the
                     obvious  representation  is  ever  produced.
                     There is no -0 on a VAX.
              Infinity is not part of the VAX architecture.
              Reserved operands:
                     of the 2**55 that the  hardware  recognizes,
                     only  one  of  them  is  ever produced.  Any
                     floating-point  operation  upon  a  reserved
                     operand,  even  a  MOVF or MOVD, customarily
                     stops computation,  so  they  are  not  much
                     used.
              Exceptions:
                     Divisions  by zero and operations that over-
                     flow are invalid operations that customarily
                     stop  computation  or,  in earlier machines,
                     produce reserved  operands  that  will  stop
                     computation.
              Rounding:
                     Every  rational operation  (+, -, *, /) on a
                     VAX (but not necessarily on  a  PDP-11),  if
                     not  an over/underflow nor division by zero,
                     is rounded to within half an _u_l_p,  and  when
                     the  rounding  error  is exactly half an _u_l_p
                     then rounding is away from 0.

       Except for its narrow range, D_floating-point  is  one  of
       the  better  computer  arithmetics designed in the 1960's.
       Its properties are reflected fairly faithfully in the ele-
       mentary  functions for a VAX distributed in 4.3 BSD.  They
       over/underflow only if their results have to  lie  out  of
       range  or very nearly so, and then they behave much as any
       rational arithmetic operation that over/underflowed  would
       behave.   Similarly,  expressions like log(0) and atanh(1)
       behave like 1/0; and sqrt(-3) and acos(3) behave like 0/0;
       they  all  produce  reserved operands and/or stop computa-
       tion!  The situation is described in more detail in manual
       pages.
              _T_h_i_s  _r_e_s_p_o_n_s_e  _s_e_e_m_s _e_x_c_e_s_s_i_v_e_l_y _p_u_n_i_t_i_v_e_, _s_o
              _i_t _i_s _d_e_s_t_i_n_e_d _t_o _b_e _r_e_p_l_a_c_e_d _a_t _s_o_m_e _t_i_m_e  _i_n
              _t_h_e  _f_o_r_e_s_e_e_a_b_l_e _f_u_t_u_r_e _b_y _a _m_o_r_e _f_l_e_x_i_b_l_e _b_u_t
              _s_t_i_l_l _u_n_i_f_o_r_m _s_c_h_e_m_e _b_e_i_n_g _d_e_v_e_l_o_p_e_d _t_o _h_a_n_d_l_e
              _a_l_l   _f_l_o_a_t_i_n_g_-_p_o_i_n_t   _a_r_i_t_h_m_e_t_i_c   _e_x_c_e_p_t_i_o_n_s
              _n_e_a_t_l_y_.  _S_e_e _i_n_f_n_a_n_(_3_M_) _f_o_r _t_h_e _p_r_e_s_e_n_t  _s_t_a_t_e



4th Berkeley Distribution  June 4, 1993                         3








MATH(3)              BSD Programmer's Manual              MATH(3)


              _o_f _a_f_f_a_i_r_s_.

       How  do  the functions in 4.3 BSD's new _l_i_b_m for UNIX com-
       pare with their counterparts  in  DEC's  VAX/VMS  library?
       Some  of the VMS functions are a little faster, some are a
       little more accurate,  some  are  more  puritanical  about
       exceptions  (like  pow(0.0,0.0)  and  atan2(0.0,0.0)), and
       most occupy much more memory than  their  counterparts  in
       _l_i_b_m.  The VMS codes interpolate in large table to achieve
       speed and accuracy; the _l_i_b_m  codes  use  tricky  formulas
       compact  enough  that  all of them may some day fit into a
       ROM.

       More important, DEC regards the VMS codes  as  proprietary
       and  guards  them zealously against unauthorized use.  But
       the _l_i_b_m codes in 4.3 BSD  are  intended  for  the  public
       domain;  they  may  be copied freely provided their prove-
       nance is always acknowledged, and  provided  users  assist
       the  authors  in  their researches by reporting experience
       with the codes.  Therefore no user of UNIX  on  a  machine
       whose  arithmetic  resembles VAX D_floating-point need use
       anything worse than the new _l_i_b_m.

       IIEEEEEE SSTTAANNDDAARRDD 775544 FFllooaattiinngg--PPooiinntt AArriitthhmmeettiicc::

       This standard is  on  its  way  to  becoming  more  widely
       adopted  than  any  other  design for computer arithmetic.
       VLSI chips that conform to some version of  that  standard
       have  been produced by a host of manufacturers, among them
       ...
            Intel i8087, i80287      National Semiconductor  32081
            Motorola 68881           Weitek WTL-1032, ... , -1165
            Zilog Z8070              Western Electric (AT&T) WE32106.
       Other implementations range from software, done thoroughly
       in    the   Apple   Macintosh,   through   VLSI   in   the
       Hewlett-Packard 9000 series, to the ELXSI 6400 running ECL
       at  3 Megaflops.  Several other companies have adopted the
       formats of IEEE 754 without, alas, adhering to  the  stan-
       dard's  way  of  handling  rounding  and  exceptions  like
       over/underflow.  The DEC VAX  G_floating-point  format  is
       very  similar  to  the  IEEE 754 Double format, so similar
       that the C programs for the IEEE versions of most  of  the
       elementary  functions  listed  above  could easily be con-
       verted to run on a MicroVAX, though nobody has volunteered
       to do that yet.

       The  codes  in 4.3 BSD's _l_i_b_m for machines that conform to
       IEEE 754 are intended primarily  for  the  National  Semi.
       32081  and WTL 1164/65.  To use these codes with the Intel
       or Zilog chips, or with the Apple Macintosh or ELXSI 6400,
       is  to  forego  the  use of better codes provided (perhaps



4th Berkeley Distribution  June 4, 1993                         4








MATH(3)              BSD Programmer's Manual              MATH(3)


       freely) by those companies and designed  by  some  of  the
       authors  of the codes above.  Except for _a_t_a_n, _c_a_b_s, _c_b_r_t,
       _e_r_f, _e_r_f_c,  _h_y_p_o_t,  _j_0_-_j_n,  _l_g_a_m_m_a,  _p_o_w  and  _y_0_-_y_n,  the
       Motorola  68881 has all the functions in _l_i_b_m on chip, and
       faster and more accurate; it, Apple, the i8087, Z8070  and
       WE32106  all  use  64  sig.  bits.  The main virtue of 4.3
       BSD's _l_i_b_m codes is that they are intended for the  public
       domain;  they  may  be copied freely provided their prove-
       nance is always acknowledged, and  provided  users  assist
       the  authors  in  their researches by reporting experience
       with the codes.  Therefore no user of UNIX  on  a  machine
       that conforms to IEEE 754 need use anything worse than the
       new _l_i_b_m.

       Properties of IEEE 754 Double-Precision:
              Wordsize: 64 bits, 8 bytes.  Radix: Binary.
              Precision: 53 sig.   bits,  roughly  like  16  sig.
              decimals.
                     If  x  and  x' are consecutive positive Dou-
                     ble-Precision  numbers  (they  differ  by  1
                     _u_l_p), then
                     1.1e-16  <  0.5**53  < (x'-x)/x <= 0.5**52 <
                     2.3e-16.
              Range: Overflow threshold  = 2.0**1024 = 1.8e308
                     Underflow threshold = 0.5**1022 = 2.2e-308
                     Overflow goes by default to a signed  Infin-
                     ity.
                     Underflow  is _G_r_a_d_u_a_l_, rounding to the near-
                     est  integer   multiple   of   0.5**1074   =
                     4.9e-324.
              Zero is represented ambiguously as +0 or -0.
                     Its sign transforms correctly through multi-
                     plication or division, and is  preserved  by
                     addition  of  zeros with like signs; but x-x
                     yields +0 for  every  finite  x.   The  only
                     operations that reveal zero's sign are divi-
                     sion by zero and copysign(x,+-0).   In  par-
                     ticular,  comparison  (x  > y, x >= y, etc.)
                     cannot be affected by the sign of zero;  but
                     if  finite  x = y then Infinity = 1/(x-y) !=
                     -1/(y-x) = -Infinity.
              Infinity is signed.
                     it persists when added to itself or  to  any
                     finite  number.   Its  sign  transforms cor-
                     rectly through multiplication and  division,
                     and  (finite)/+-Infinity = +-0 (nonzero)/0 =
                     +-Infinity.  But  Infinity-Infinity,  Infin-
                     ity*0  and  Infinity/Infinity  are, like 0/0
                     and sqrt(-3), invalid operations  that  pro-
                     duce _N_a_N. ...
              Reserved operands:



4th Berkeley Distribution  June 4, 1993                         5








MATH(3)              BSD Programmer's Manual              MATH(3)


                     there  are  2**53-2  of them, all called _N_a_N
                     (_Not  _a  _Number).   Some,  called  Signaling
                     _N_a_Ns, trap any floating-point operation per-
                     formed upon them;  they  are  used  to  mark
                     missing or uninitialized values, or nonexis-
                     tent elements of arrays.  The rest are Quiet
                     _N_a_Ns;   they  are  the  default  results  of
                     Invalid Operations,  and  propagate  through
                     subsequent arithmetic operations.  If x != x
                     then x is _N_a_N; every other predicate (x > y,
                     x  =  y,  x  <  y,  ...)  is FALSE if _N_a_N is
                     involved.
                     NOTE: Trichotomy is violated by _N_a_N.
                             Besides being FALSE, predicates that
                             entail  ordered  comparison,  rather
                             than   mere   (in)equality,   signal
                             Invalid   Operation   when   _N_a_N  is
                             involved.
              Rounding:
                     Every algebraic operation (+, -, *, /, sqrt)
                     is rounded by default to within half an _u_l_p,
                     and when the rounding error is exactly  half
                     an  _u_l_p  then the rounded value's least sig-
                     nificant bit is zero.  This kind of rounding
                     is usually the best kind, sometimes provably
                     so; for instance, for every x  =  1.0,  2.0,
                     3.0,  4.0, ..., 2.0**52, we find (x/3.0)*3.0
                     == x and (x/10.0)*10.0 == x and ...  despite
                     that  both  the  quotients  and the products
                     have been rounded.  Only rounding like  IEEE
                     754  can  do  that.   But  no single kind of
                     rounding can be proved best for  every  cir-
                     cumstance,  so  IEEE  754  provides rounding
                     towards zero or towards +Infinity or towards
                     -Infinity  at  the programmer's option.  And
                     the same kinds of rounding are specified for
                     Binary-Decimal  Conversions,  at  least  for
                     magnitudes  between  roughly   1.0e-10   and
                     1.0e37.
              Exceptions:
                     IEEE  754  recognizes  five  kinds of float-
                     ing-point  exceptions,   listed   below   in
                     declining order of probable importance.
                             Exception              Default Result
                             __________________________________________
                             Invalid Operation      _N_a_N, or FALSE
                             Overflow               +-Infinity
                             Divide by Zero         +-Infinity
                             Underflow              Gradual Underflow
                             Inexact                Rounded value
                     NOTE:   An  Exception is not an Error unless



4th Berkeley Distribution  June 4, 1993                         6








MATH(3)              BSD Programmer's Manual              MATH(3)


                     handled badly.  What makes a class of excep-
                     tions  exceptional is that no single default
                     response  can  be  satisfactory   in   every
                     instance.   On  the other hand, if a default
                     response will serve most instances satisfac-
                     torily,  the unsatisfactory instances cannot
                     justify aborting computation every time  the
                     exception occurs.

              For each kind of floating-point exception, IEEE 754
              provides a Flag that is raised each time its excep-
              tion  is  signaled, and stays raised until the pro-
              gram resets it.  Programs may also test,  save  and
              restore a flag.  Thus, IEEE 754 provides three ways
              by which programs  may  cope  with  exceptions  for
              which the default result might be unsatisfactory:

              1)  Test for a condition that might cause an excep-
                  tion later, and branch to avoid the  exception.

              2)  Test  a  flag  to  see whether an exception has
                  occurred since the program last reset its flag.

              3)  Test a result to see whether it is a value that
                  only an exception could have produced.
                  CAUTION: The only  reliable  ways  to  discover
                  whether  Underflow  has  occurred  are  to test
                  whether products or  quotients  lie  closer  to
                  zero  than  the underflow threshold, or to test
                  the Underflow flag.  (Sums and differences can-
                  not  underflow  in IEEE 754; if x != y then x-y
                  is correct  to  full  precision  and  certainly
                  nonzero  regardless  of  how  tiny  it may be.)
                  Products and quotients that underflow gradually
                  can  lose accuracy gradually without vanishing,
                  so comparing them with zero (as one might on  a
                  VAX) will not reveal the loss.  Fortunately, if
                  a gradually underflowed value is destined to be
                  added  to  something  bigger than the underflow
                  threshold, as is almost always the case, digits
                  lost  to  gradual  underflow will not be missed
                  because they would have been rounded  off  any-
                  way.   So  gradual underflows are usually _p_r_o_v_-
                  _a_b_l_y ignorable.  The same  cannot  be  said  of
                  underflows flushed to 0.

              At  the option of an implementor conforming to IEEE
              754, other ways to cope with exceptions may be pro-
              vided:

              4)  ABORT.   This mechanism classifies an exception



4th Berkeley Distribution  June 4, 1993                         7








MATH(3)              BSD Programmer's Manual              MATH(3)


                  in advance as an  incident  to  be  handled  by
                  means     traditionally     associated     with
                  error-handling statements like "ON ERROR GO  TO
                  ...".    Different  languages  offer  different
                  forms of this statement,  but  most  share  the
                  following characteristics:

              --  No  means is provided to substitute a value for
                  the offending  operation's  result  and  resume
                  computation  from  what may be the middle of an
                  expression.  An  exceptional  result  is  aban-
                  doned.

              --  In  a  subprogram  that lacks an error-handling
                  statement, an exception causes  the  subprogram
                  to abort within whatever program called it, and
                  so on back up the chain of calling  subprograms
                  until  an  error-handling  statement is encoun-
                  tered or the whole task is aborted  and  memory
                  is dumped.

              5)  STOP.  This mechanism, requiring an interactive
                  debugging environment, is more for the program-
                  mer  than the program.  It classifies an excep-
                  tion in advance as a symptom of a  programmer's
                  error; the exception suspends execution as near
                  as it can to the offending  operation  so  that
                  the  programmer  can  look around to see how it
                  happened.  Quite often the first several excep-
                  tions  turn out to be quite unexceptionable, so
                  the programmer ought  ideally  to  be  able  to
                  resume execution after each one as if execution
                  had not been stopped.

              6)  ... Other ways lie beyond  the  scope  of  this
                  document.

       The  crucial problem for exception handling is the problem
       of Scope, and the problem's solution  is  understood,  but
       not enough manpower was available to implement it fully in
       time to be distributed in 4.3 BSD's _l_i_b_m.   Ideally,  each
       elementary  function should act as if it were indivisible,
       or atomic, in the sense that ...

       i)    No exception should be signaled that is not deserved
             by the data supplied to that function.

       ii)   Any  exception  signaled  should  be identified with
             that function rather than with one  of  its  subrou-
             tines.




4th Berkeley Distribution  June 4, 1993                         8








MATH(3)              BSD Programmer's Manual              MATH(3)


       iii)  The  internal  behavior of an atomic function should
             not be disrupted when a calling program changes from
             one  to  another  of the five or so ways of handling
             exceptions listed above, although the definition  of
             the  function  may  be correlated intentionally with
             exception handling.

       Ideally, every programmer should be able  _c_o_n_v_e_n_i_e_n_t_l_y  to
       turn a debugged subprogram into one that appears atomic to
       its users.  But simulating all three characteristics of an
       atomic function is still a tedious affair, entailing hosts
       of tests and saves-restores; work is under way to  amelio-
       rate the inconvenience.

       Meanwhile,  the  functions  in _l_i_b_m are only approximately
       atomic.  They signal  no  inappropriate  exception  except
       possibly ...
              Over/Underflow
                     when  a  result, if properly computed, might
                     have lain barely within range, and
              Inexact in _c_a_b_s, _c_b_r_t, _h_y_p_o_t, _l_o_g_1_0 and _p_o_w
                     when it happens to be exact, thanks to  for-
                     tuitous cancellation of errors.
       Otherwise, ...
              Invalid Operation is signaled only when
                     any  result  but  _N_a_N would probably be mis-
                     leading.
              Overflow is signaled only when
                     the exact result would be finite but  beyond
                     the overflow threshold.
              Divide-by-Zero is signaled only when
                     a  function takes exactly infinite values at
                     finite operands.
              Underflow is signaled only when
                     the exact result would be nonzero but tinier
                     than the underflow threshold.
              Inexact is signaled only when
                     greater  range  or precision would be needed
                     to represent the exact result.

BBUUGGSS
       When signals are appropriate, they are emitted by  certain
       operations  within the codes, so a subroutine-trace may be
       needed to identify the function with its  signal  in  case
       method  5)  above  is  in use.  And the codes all take the
       IEEE 754 defaults for granted; this means that a  decision
       to  trap  all  divisions by zero could disrupt a code that
       would otherwise get correct results  despite  division  by
       zero.





4th Berkeley Distribution  June 4, 1993                         9








MATH(3)              BSD Programmer's Manual              MATH(3)


SSEEEE AALLSSOO
       An explanation of IEEE 754 and its proposed extension p854
       was published in the IEEE magazine MICRO  in  August  1984
       under     the     title    "A    Proposed    Radix-    and
       Word-length-independent Standard for Floating-point Arith-
       metic" by W. J. Cody et al.  The manuals for Pascal, C and
       BASIC on the Apple Macintosh document the features of IEEE
       754  pretty  well.  Articles in the IEEE magazine COMPUTER
       vol. 14 no. 3 (Mar.  1981), and in the ACM SIGNUM Newslet-
       ter  Special  Issue  of Oct. 1979, may be helpful although
       they pertain to superseded drafts of the standard.











































4th Berkeley Distribution  June 4, 1993                        10