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.4 (Berkeley) 09/22/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 #include "mathimpl.h" 66 67 vc(ln10hi, 2.3025850929940456790E0 ,5d8d,4113,a8ac,ddaa, 2, .935D8DDDAAA8AC) 68 69 ic(ivln10, 4.3429448190325181667E-1, -2, 1.BCB7B1526E50E) 70 71 #ifdef vccast 72 #define ln10hi vccast(ln10hi) 73 #endif 74 75 76 double log10(x) 77 double x; 78 { 79 #if defined(vax)||defined(tahoe) 80 return(log(x)/ln10hi); 81 #else /* defined(vax)||defined(tahoe) */ 82 return(ivln10*log(x)); 83 #endif /* defined(vax)||defined(tahoe) */ 84 } 85