Commit | Line | Data |
---|---|---|
be8ee4f0 C |
1 | EXP(3) BSD Programmer's Manual EXP(3) |
2 | ||
3 | N\bNA\bAM\bME\bE | |
4 | 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- | |
5 | tions | |
6 | ||
7 | S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS | |
8 | #\b#i\bin\bnc\bcl\blu\bud\bde\be <\b<m\bma\bat\bth\bh.\b.h\bh>\b> | |
9 | ||
10 | _\bd_\bo_\bu_\bb_\bl_\be | |
11 | e\bex\bxp\bp(_\bd_\bo_\bu_\bb_\bl_\be _\bx); | |
12 | ||
13 | _\bd_\bo_\bu_\bb_\bl_\be | |
14 | e\bex\bxp\bpm\bm1\b1(_\bd_\bo_\bu_\bb_\bl_\be _\bx); | |
15 | ||
16 | _\bd_\bo_\bu_\bb_\bl_\be | |
17 | l\blo\bog\bg(_\bd_\bo_\bu_\bb_\bl_\be _\bx); | |
18 | ||
19 | _\bd_\bo_\bu_\bb_\bl_\be | |
20 | l\blo\bog\bg1\b10\b0(_\bd_\bo_\bu_\bb_\bl_\be _\bx); | |
21 | ||
22 | _\bd_\bo_\bu_\bb_\bl_\be | |
23 | l\blo\bog\bg1\b1p\bp(_\bd_\bo_\bu_\bb_\bl_\be _\bx); | |
24 | ||
25 | _\bd_\bo_\bu_\bb_\bl_\be | |
26 | p\bpo\bow\bw(_\bd_\bo_\bu_\bb_\bl_\be _\bx, _\bd_\bo_\bu_\bb_\bl_\be _\by); | |
27 | ||
28 | D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN | |
29 | The e\bex\bxp\bp() function computes the exponential value of the given argument | |
30 | _\bx. | |
31 | ||
32 | The e\bex\bxp\bpm\bm1\b1() function computes the value exp(x)-1 accurately even for tiny | |
33 | argument _\bx. | |
34 | ||
35 | The l\blo\bog\bg() function computes the value for the natural logarithm of the | |
36 | argument x. | |
37 | ||
38 | The l\blo\bog\bg1\b10\b0() function computes the value for the logarithm of argument _\bx | |
39 | to base 10. | |
40 | ||
41 | The l\blo\bog\bg1\b1p\bp() function computes the value of log(1+x) accurately even for | |
42 | tiny argument _\bx. | |
43 | ||
44 | The p\bpo\bow\bw() computes the value of _\bx to the exponent _\by. | |
45 | ||
46 | 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) | |
47 | exp(x), log(x), expm1(x) and log1p(x) are accurate to within an _\bu_\bp, and | |
48 | 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 | |
49 | error in p\bpo\bow\bw(_\bx, _\by) is below about 2 _\bu_\bp_\bs when its magnitude is moderate, | |
50 | but increases as p\bpo\bow\bw(_\bx, _\by) approaches the over/underflow thresholds until | |
51 | almost as many bits could be lost as are occupied by the floating-point | |
52 | format's exponent field; that is 8 bits for VAX D and 11 bits for IEEE | |
53 | 754 Double. No such drastic loss has been exposed by testing; the worst | |
54 | errors observed have been below 20 _\bu_\bp_\bs for VAX D, 300 _\bu_\bp_\bs for IEEE 754 | |
55 | Double. Moderate values of p\bpo\bow\bw() are accurate enough that p\bpo\bow\bw(_\bi_\bn_\bt_\be_\bg_\be_\br, | |
56 | _\bi_\bn_\bt_\be_\bg_\be_\br) is exact until it is bigger than 2**56 on a VAX, 2**53 for IEEE | |
57 | 754. | |
58 | ||
59 | R\bRE\bET\bTU\bUR\bRN\bN V\bVA\bAL\bLU\bUE\bES\bS | |
60 | These functions will return the approprate computation unless an error | |
61 | occurs or an argument is out of range. The functions e\bex\bxp\bp(), e\bex\bxp\bpm\bm1\b1() and | |
62 | p\bpo\bow\bw() detect if the computed value will overflow, set the global variable | |
63 | _\be_\br_\br_\bn_\bo _\bt_\bo RANGE and cause a reserved operand fault on a VAX or Tahoe. The | |
64 | function p\bpo\bow\bw(_\bx, _\by) checks to see if _\bx < 0 and _\by is not an integer, in the | |
65 | event this is true, the global variable _\be_\br_\br_\bn_\bo is set to EDOM and on the | |
66 | VAX and Tahoe generate a reserved operand fault. On a VAX and Tahoe, | |
67 | _\be_\br_\br_\bn_\bo is set to EDOM and the reserved operand is returned by log unless _\bx | |
68 | > 0, by l\blo\bog\bg1\b1p\bp() unless _\bx > -1. | |
69 | ||
70 | N\bNO\bOT\bTE\bES\bS | |
71 | The functions exp(x)-1 and log(1+x) are called expm1 and logp1 in BASIC | |
72 | on the Hewlett-Packard HP-71B and APPLE Macintosh, EXP1 and LN1 in Pas- | |
73 | cal, exp1 and log1 in C on APPLE Macintoshes, where they have been pro- | |
74 | vided to make sure financial calculations of ((1+x)**n-1)/x, namely | |
75 | expm1(n*log1p(x))/x, will be accurate when x is tiny. They also provide | |
76 | accurate inverse hyperbolic functions. | |
77 | ||
78 | The function p\bpo\bow\bw(_\bx, _\b0) returns x**0 = 1 for all x including x = 0, Infin- | |
79 | ity (not found on a VAX), and _\bN_\ba_\bN (the reserved operand on a VAX). | |
80 | Previous implementations of pow may have defined x**0 to be undefined in | |
81 | some or all of these cases. Here are reasons for returning x**0 = 1 al- | |
82 | ways: | |
83 | ||
84 | 1. Any program that already tests whether x is zero (or infinite or | |
85 | _\bN_\ba_\bN) before computing x**0 cannot care whether 0**0 = 1 or not. | |
86 | Any program that depends upon 0**0 to be invalid is dubious any- | |
87 | way since that expression's meaning and, if invalid, its conse- | |
88 | quences vary from one computer system to another. | |
89 | ||
90 | 2. Some Algebra texts (e.g. Sigler's) define x**0 = 1 for all x, in- | |
91 | cluding x = 0. This is compatible with the convention that ac- | |
92 | cepts a[0] as the value of polynomial | |
93 | ||
94 | p(x) = a[0]*x**0 + a[1]*x**1 + a[2]*x**2 +...+ a[n]*x**n | |
95 | ||
96 | at x = 0 rather than reject a[0]*0**0 as invalid. | |
97 | ||
98 | 3. Analysts will accept 0**0 = 1 despite that x**y can approach any- | |
99 | thing or nothing as x and y approach 0 independently. The reason | |
100 | for setting 0**0 = 1 anyway is this: | |
101 | ||
102 | If x(z) and y(z) are _\ba_\bn_\by functions analytic (expandable in | |
103 | power series) in z around z = 0, and if there x(0) = y(0) = | |
104 | 0, then x(z)**y(z) -> 1 as z -> 0. | |
105 | ||
106 | 4. If 0**0 = 1, then infinity**0 = 1/0**0 = 1 too; and then _\bN_\ba_\bN**0 = | |
107 | 1 too because x**0 = 1 for all finite and infinite x, i.e., inde- | |
108 | pendently of x. | |
109 | ||
110 | S\bSE\bEE\bE A\bAL\bLS\bSO\bO | |
111 | math(3), infnan(3) | |
112 | ||
113 | H\bHI\bIS\bST\bTO\bOR\bRY\bY | |
114 | A e\bex\bxp\bp(), l\blo\bog\bg() and p\bpo\bow\bw() function appeared in Version 6 AT&T UNIX. A | |
115 | l\blo\bog\bg1\b10\b0() function appeared in Version 7 AT&T UNIX. The l\blo\bog\bg1\b1p\bp() and | |
116 | e\bex\bxp\bpm\bm1\b1() functions appeared in 4.3BSD. | |
117 | ||
118 | 4th Berkeley Distribution June 4, 1993 2 |