EXP(3) BSD Programmer's Manual EXP(3)
e
\bex
\bxp
\bp, e
\bex
\bxp
\bpm
\bm1
\b1, l
\blo
\bog
\bg, l
\blo
\bog
\bg1
\b10
\b0, l
\blo
\bog
\bg1
\b1p
\bp, p
\bpo
\bow
\bw - exponential, logarithm, power func-
S
\bSY
\bYN
\bNO
\bOP
\bPS
\bSI
\bIS
\bS
#
\b#i
\bin
\bnc
\bcl
\blu
\bud
\bde
\be <
\b<m
\bma
\bat
\bth
\bh.
\b.h
\bh>
\b>
e
\bex
\bxp
\bp(_
\bd_
\bo_
\bu_
\bb_
\bl_
\be _
\bx);
e
\bex
\bxp
\bpm
\bm1
\b1(_
\bd_
\bo_
\bu_
\bb_
\bl_
\be _
\bx);
l
\blo
\bog
\bg(_
\bd_
\bo_
\bu_
\bb_
\bl_
\be _
\bx);
l
\blo
\bog
\bg1
\b10
\b0(_
\bd_
\bo_
\bu_
\bb_
\bl_
\be _
\bx);
l
\blo
\bog
\bg1
\b1p
\bp(_
\bd_
\bo_
\bu_
\bb_
\bl_
\be _
\bx);
p
\bpo
\bow
\bw(_
\bd_
\bo_
\bu_
\bb_
\bl_
\be _
\bx, _
\bd_
\bo_
\bu_
\bb_
\bl_
\be _
\by);
D
\bDE
\bES
\bSC
\bCR
\bRI
\bIP
\bPT
\bTI
\bIO
\bON
\bN
The e
\bex
\bxp
\bp() function computes the exponential value of the given argument
The e
\bex
\bxp
\bpm
\bm1
\b1() function computes the value exp(x)-1 accurately even for tiny
The l
\blo
\bog
\bg() function computes the value for the natural logarithm of the
The l
\blo
\bog
\bg1
\b10
\b0() function computes the value for the logarithm of argument _
\bx
The l
\blo
\bog
\bg1
\b1p
\bp() function computes the value of log(1+x) accurately even for
The p
\bpo
\bow
\bw() computes the value of _
\bx to the exponent _
\by.
E
\bER
\bRR
\bRO
\bOR
\bR (
\b(d
\bdu
\bue
\be t
\bto
\bo R
\bRo
\bou
\bun
\bnd
\bdo
\bof
\bff
\bf e
\bet
\btc
\bc.
\b.)
\b)
exp(x), log(x), expm1(x) and log1p(x) are accurate to within an _
\bu_
\bp, and
log10(x) to within about 2 _
\bu_
\bp_
\bs; an _
\bu_
\bp is one _
\bU_
\bn_
\bi_
\bt in the _
\bL_
\ba_
\bs_
\bt _
\bP_
\bl_
\ba_
\bc_
\be. The
error in p
\bpo
\bow
\bw(_
\bx, _
\by) is below about 2 _
\bu_
\bp_
\bs when its magnitude is moderate,
but increases as p
\bpo
\bow
\bw(_
\bx, _
\by) approaches the over/underflow thresholds until
almost as many bits could be lost as are occupied by the floating-point
format's exponent field; that is 8 bits for VAX D and 11 bits for IEEE
754 Double. No such drastic loss has been exposed by testing; the worst
errors observed have been below 20 _
\bu_
\bp_
\bs for VAX D, 300 _
\bu_
\bp_
\bs for IEEE 754
Double. Moderate values of p
\bpo
\bow
\bw() are accurate enough that p
\bpo
\bow
\bw(_
\bi_
\bn_
\bt_
\be_
\bg_
\be_
\br,
_
\bi_
\bn_
\bt_
\be_
\bg_
\be_
\br) is exact until it is bigger than 2**56 on a VAX, 2**53 for IEEE
R
\bRE
\bET
\bTU
\bUR
\bRN
\bN V
\bVA
\bAL
\bLU
\bUE
\bES
\bS
These functions will return the approprate computation unless an error
occurs or an argument is out of range. The functions e
\bex
\bxp
\bp(), e
\bex
\bxp
\bpm
\bm1
\b1() and
p
\bpo
\bow
\bw() detect if the computed value will overflow, set the global variable
_
\be_
\br_
\br_
\bn_
\bo _
\bt_
\bo RANGE and cause a reserved operand fault on a VAX or Tahoe. The
function p
\bpo
\bow
\bw(_
\bx, _
\by) checks to see if _
\bx < 0 and _
\by is not an integer, in the
event this is true, the global variable _
\be_
\br_
\br_
\bn_
\bo is set to EDOM and on the
VAX and Tahoe generate a reserved operand fault. On a VAX and Tahoe,
_
\be_
\br_
\br_
\bn_
\bo is set to EDOM and the reserved operand is returned by log unless _
\bx
> 0, by l
\blo
\bog
\bg1
\b1p
\bp() unless _
\bx > -1.
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 Pas-
cal, exp1 and log1 in C on APPLE Macintoshes, where they have been pro-
vided 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.
The function p
\bpo
\bow
\bw(_
\bx, _
\b0) returns x**0 = 1 for all x including x = 0, Infin-
ity (not found on a VAX), and _
\bN_
\ba_
\bN (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 al-
1. Any program that already tests whether x is zero (or infinite or
_
\bN_
\ba_
\bN) before computing x**0 cannot care whether 0**0 = 1 or not.
Any program that depends upon 0**0 to be invalid is dubious any-
way since that expression's meaning and, if invalid, its conse-
quences vary from one computer system to another.
2. Some Algebra texts (e.g. Sigler's) define x**0 = 1 for all x, in-
cluding x = 0. This is compatible with the convention that ac-
cepts 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 any-
thing 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 _
\ba_
\bn_
\by 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 _
\bN_
\ba_
\bN**0 =
1 too because x**0 = 1 for all finite and infinite x, i.e., inde-
S
\bSE
\bEE
\bE A
\bAL
\bLS
\bSO
\bO
H
\bHI
\bIS
\bST
\bTO
\bOR
\bRY
\bY
A e
\bex
\bxp
\bp(), l
\blo
\bog
\bg() and p
\bpo
\bow
\bw() function appeared in Version 6 AT&T UNIX. A
l
\blo
\bog
\bg1
\b10
\b0() function appeared in Version 7 AT&T UNIX. The l
\blo
\bog
\bg1
\b1p
\bp() and
e
\bex
\bxp
\bpm
\bm1
\b1() functions appeared in 4.3BSD.
4th Berkeley Distribution June 4, 1993 2