EXP(3M)EXP(3M)NAME
exp, log, log10, pow, expm1, log1p - exponential, logarithm, power
SYNOPSIS
#include <math.h>
double exp(double x);
double log(double x);
double log10(double x);
double pow(double x, double y);
(ALSO AVAILABLE IN BSD)
double expm1(double x);
double log1p(double x);
DESCRIPTION
Exp returns the exponential function of x.
Log returns the natural logarithm of x.
Log10 returns the logarithm of x to base 10.
Pow(x,y) returns x**y.
Expm1 returns exp(x)-1 accurately even for tiny x.
Log1p returns log(1+x) accurately even for tiny x.
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. No such drastic loss has
been exposed by testing. Moderate values of pow are accurate enough
that pow(integer,integer) is exact until it is bigger than 2**56 on a
VAX, 2**53 for IEEE 754.
NOTES
The functions exp(x)-1 and log(1+x) are called expm1 and logp1 in BASIC
on the Hewlett-Packard HP-71B and APPLE Macintosh, EXP1 and LN1 in
Pascal, exp1 and log1 in C on APPLE Macintoshes, where they have been
provided to make sure financial calculations of ((1+x)**n-1)/x, namely
expm1(n∗log1p(x))/x, will be accurate when x is tiny. They also
provide accurate inverse hyperbolic functions.
Pow(x,0) returns x**0 = 1 for all x including x = 0, Infinity operand
on a VAX). 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
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 ALSOmath(3M)AUTHOR
Kwok-Choi Ng, W. Kahan
4th Berkeley Distribution August 1, 1992 EXP(3M)