Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

math(3M)

EXP(3M)  —  UNIX Programmer’s Manual

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 xy. 

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, ∞, and NaN (the reserved 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 ∞∗∗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

4th Berkeley Distribution  —  August 1, 1992

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