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