install approved copyright notice
[unix-history] / usr / src / lib / libm / common_source / log10.c
CommitLineData
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 24static 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 73static long ln10hix[] = { _0x(5d8d,4113), _0x(a8ac,ddaa)};
e5802129 74#define ln10hi (*(double*)ln10hix)
859dc438 75#else /* defined(vax)||defined(tahoe) */
e5802129
ZAL
76static double
77ivln10 = 4.3429448190325181667E-1 ; /*Hex 2^ -2 * 1.BCB7B1526E50E */
859dc438 78#endif /* defined(vax)||defined(tahoe) */
e5802129
ZAL
79
80double log10(x)
81double 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}