1 /* 2 * Copyright (c) 1985 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 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. 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. 21 */ 22 23 #ifndef lint 24 static char sccsid[] = "@(#)log10.c 5.3 (Berkeley) 06/30/88"; 25 #endif /* not lint */ 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 65 #if defined(vax)||defined(tahoe) /* VAX D format (56 bits) */ 66 #ifdef vax 67 #define _0x(A,B) 0x/**/A/**/B 68 #else /* vax */ 69 #define _0x(A,B) 0x/**/B/**/A 70 #endif /* vax */ 71 /* static double */ 72 /* ln10hi = 2.3025850929940456790E0 ; Hex 2^ 2 * .935D8DDDAAA8AC */ 73 static long ln10hix[] = { _0x(5d8d,4113), _0x(a8ac,ddaa)}; 74 #define ln10hi (*(double*)ln10hix) 75 #else /* defined(vax)||defined(tahoe) */ 76 static double 77 ivln10 = 4.3429448190325181667E-1 ; /*Hex 2^ -2 * 1.BCB7B1526E50E */ 78 #endif /* defined(vax)||defined(tahoe) */ 79 80 double log10(x) 81 double x; 82 { 83 double log(); 84 85 #if defined(vax)||defined(tahoe) 86 return(log(x)/ln10hi); 87 #else /* defined(vax)||defined(tahoe) */ 88 return(ivln10*log(x)); 89 #endif /* defined(vax)||defined(tahoe) */ 90 } 91