Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ exp(3M) — sysv — mips UMIPS RISC/os 4.52

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

math(3M)



EXP(3M-SysV)        RISC/os Reference Manual         EXP(3M-SysV)



NAME
     exp, expm1, log, log10, log1p, pow - exponential, logarithm,
     power

SYNOPSIS
     #include <math.h>

     double exp(x)
     double x;

     float fexp(float x)
     float x;

     double expm1(x)
     double x;

     float fexpm1(float x)
     float x;

     double log(x)
     double x;

     float flog(float x)
     float x;

     double log10(x)
     double x;

     float flog10(float x)
     float x;

     double log1p(x)
     double x;

     float flog1p(float x)
     float x;

     double pow(x,y)
     double x,y;

DESCRIPTION
     exp and fexp return the exponential function of x for double
     and float data types respectively.

     expm1 and fexpm1 return exp(x)-1 accurately even for tiny x
     for double and float data types respectively.

     log and flog return the natural logarithm of x for double
     and float data types respectively.

     log10 and flog10 return the logarithm of x to base 10 for
     double and float data types respectively.



                         Printed 1/15/91                   Page 1





EXP(3M-SysV)        RISC/os Reference Manual         EXP(3M-SysV)



     log1p and log1p return log(1+x) accurately even for tiny x
     for double and float data types respectively.

     Pow(x,y) returns x**y.

ERROR (due to Roundoff etc.)
     exp(x), log(x), expm1(x) and log1p(x)
      are accurate to within an ulp, and log10(x) to within about
     2 ulps; an ulp is one Unit in the Last Place.  The error in
     pow(x,y) is below about 2 ulps when its magnitude is
     moderate, but increases as pow(x,y) approaches the
     over/underflow thresholds until almost as many bits could be
     lost as are occupied by the floating-point format's exponent
     field; 11 bits for IEEE 754 Double.  No such drastic loss
     has been exposed by testing; the worst errors observed have
     been below 300 ulps for IEEE 754 Double.  Moderate values of
     pow are accurate enough that pow(integer,integer) is exact
     until it is bigger than 2**53 for IEEE 754 Double.

DIAGNOSTICS
     exp returns Infinity when the correct value would overflow,
     or the smallest non-zero value when the correct value would
     underflow.

     log and log10 return the default quiet NaN when x is less
     than zero indicating the invalid operation.  log and log10
     return -Infinity when x is zero.

     pow returns Infinity when x is 0 and y is non-positive.  pow
     returns NaN when x is negative and y is not an integer indi-
     cating the invalid operation.  When the correct value for
     pow would overflow or underflow, pow returns +Infinity or 0
     respectively.

NOTES
     pow(x,0) returns x**0 = 1 for all x including x = 0, Infin-
     ity, and NaN.  Previous implementations of pow may have
     defined x**0 to be undefined in some or all of these cases.
     Here are reasons for returning x**0 = 1 always:

     (1) Any program that already tests whether x is zero (or
         infinite or NaN) before computing x**0 cannot care
         whether 0**0 = 1 or not. Any program that depends upon
         0**0 to be invalid is dubious anyway since that
         expression's meaning and, if invalid, its consequences
         vary from one computer system to another.

     (2) Some Algebra texts (e.g. Sigler's) define x**0 = 1 for
         all x, including x = 0.  This is compatible with the
         convention that accepts a[0] as the value of polynomial
         p(x) = a[0]*x**0 + a[1]*x**1 + a[2]*x**2 +...+ a[n]*x**n




 Page 2                  Printed 1/15/91





EXP(3M-SysV)        RISC/os Reference Manual         EXP(3M-SysV)



         at x = 0 rather than reject a[0]*0**0 as invalid.

     (3) Analysts will accept 0**0 = 1 despite that x**y can
         approach anything or nothing as x and y approach 0
         independently.  The reason for setting 0**0 = 1 anyway
         is this:

         If x(z) and y(z) are any functions analytic (expandable
         in power series) in z around z = 0, and if there x(0) =
         y(0) = 0, then x(z)**y(z) -> 1 as z -> 0.

     (4) If 0**0 = 1, then infinity**0 = 1/0**0 = 1 too; and then
         NaN**0 = 1 too because x**0 = 1 for all finite and
         infinite x, i.e., independently of x.

SEE ALSO
     math(3M)

AUTHOR
     Kwok-Choi Ng, W. Kahan



































                         Printed 1/15/91                   Page 3



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