Commit | Line | Data |
---|---|---|
9b525f39 | 1 | /* |
e5802129 | 2 | * Copyright (c) 1985 Regents of the University of California. |
9b525f39 KB |
3 | * All rights reserved. |
4 | * | |
5 | * Redistribution and use in source and binary forms are permitted | |
a399f6c8 KB |
6 | * provided that the above copyright notice and this paragraph are |
7 | * duplicated in all such forms and that any documentation, | |
8 | * advertising materials, and other materials related to such | |
9 | * distribution and use acknowledge that the software was developed | |
10 | * by the University of California, Berkeley. The name of the | |
11 | * University may not be used to endorse or promote products derived | |
12 | * from this software without specific prior written permission. | |
13 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR | |
14 | * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED | |
15 | * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. | |
9b525f39 KB |
16 | * |
17 | * All recipients should regard themselves as participants in an ongoing | |
18 | * research project and hence should feel obligated to report their | |
19 | * experiences (good or bad) with these elementary function codes, using | |
20 | * the sendbug(8) program, to the authors. | |
e5802129 ZAL |
21 | */ |
22 | ||
23 | #ifndef lint | |
a399f6c8 | 24 | static char sccsid[] = "@(#)log10.c 5.3 (Berkeley) %G%"; |
9b525f39 | 25 | #endif /* not lint */ |
e5802129 ZAL |
26 | |
27 | /* LOG10(X) | |
28 | * RETURN THE BASE 10 LOGARITHM OF x | |
29 | * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS) | |
30 | * CODED IN C BY K.C. NG, 1/20/85; | |
31 | * REVISED BY K.C. NG on 1/23/85, 3/7/85, 4/16/85. | |
32 | * | |
33 | * Required kernel function: | |
34 | * log(x) | |
35 | * | |
36 | * Method : | |
37 | * log(x) | |
38 | * log10(x) = --------- or [1/log(10)]*log(x) | |
39 | * log(10) | |
40 | * | |
41 | * Note: | |
42 | * [log(10)] rounded to 56 bits has error .0895 ulps, | |
43 | * [1/log(10)] rounded to 53 bits has error .198 ulps; | |
44 | * therefore, for better accuracy, in VAX D format, we divide | |
45 | * log(x) by log(10), but in IEEE Double format, we multiply | |
46 | * log(x) by [1/log(10)]. | |
47 | * | |
48 | * Special cases: | |
49 | * log10(x) is NaN with signal if x < 0; | |
50 | * log10(+INF) is +INF with no signal; log10(0) is -INF with signal; | |
51 | * log10(NaN) is that NaN with no signal. | |
52 | * | |
53 | * Accuracy: | |
54 | * log10(X) returns the exact log10(x) nearly rounded. In a test run | |
55 | * with 1,536,000 random arguments on a VAX, the maximum observed | |
56 | * error was 1.74 ulps (units in the last place). | |
57 | * | |
58 | * Constants: | |
59 | * The hexadecimal values are the intended ones for the following constants. | |
60 | * The decimal values may be used, provided that the compiler will convert | |
61 | * from decimal to binary accurately enough to produce the hexadecimal values | |
62 | * shown. | |
63 | */ | |
64 | ||
859dc438 ZAL |
65 | #if defined(vax)||defined(tahoe) /* VAX D format (56 bits) */ |
66 | #ifdef vax | |
0e01cbea | 67 | #define _0x(A,B) 0x/**/A/**/B |
859dc438 | 68 | #else /* vax */ |
0e01cbea | 69 | #define _0x(A,B) 0x/**/B/**/A |
859dc438 | 70 | #endif /* vax */ |
e5802129 ZAL |
71 | /* static double */ |
72 | /* ln10hi = 2.3025850929940456790E0 ; Hex 2^ 2 * .935D8DDDAAA8AC */ | |
0e01cbea | 73 | static long ln10hix[] = { _0x(5d8d,4113), _0x(a8ac,ddaa)}; |
e5802129 | 74 | #define ln10hi (*(double*)ln10hix) |
859dc438 | 75 | #else /* defined(vax)||defined(tahoe) */ |
e5802129 ZAL |
76 | static double |
77 | ivln10 = 4.3429448190325181667E-1 ; /*Hex 2^ -2 * 1.BCB7B1526E50E */ | |
859dc438 | 78 | #endif /* defined(vax)||defined(tahoe) */ |
e5802129 ZAL |
79 | |
80 | double log10(x) | |
81 | double x; | |
82 | { | |
83 | double log(); | |
84 | ||
859dc438 | 85 | #if defined(vax)||defined(tahoe) |
e5802129 | 86 | return(log(x)/ln10hi); |
859dc438 | 87 | #else /* defined(vax)||defined(tahoe) */ |
e5802129 | 88 | return(ivln10*log(x)); |
859dc438 | 89 | #endif /* defined(vax)||defined(tahoe) */ |
e5802129 | 90 | } |