1 
2 /* @(#)w_log10.c 5.1 93/09/24 */
3 /*
4  * ====================================================
5  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6  *
7  * Developed at SunPro, a Sun Microsystems, Inc. business.
8  * Permission to use, copy, modify, and distribute this
9  * software is freely granted, provided that this notice
10  * is preserved.
11  * ====================================================
12  */
13 
14 /*
15 FUNCTION
16 	<<log10>>, <<log10f>>---base 10 logarithms
17 
18 INDEX
19 log10
20 INDEX
21 log10f
22 
23 ANSI_SYNOPSIS
24 	#include <math.h>
25 	double log10(double <[x]>);
26 	float log10f(float <[x]>);
27 
28 TRAD_SYNOPSIS
29 	#include <math.h>
30 	double log10(<[x]>)
31 	double <[x]>;
32 
33 	float log10f(<[x]>)
34 	float <[x]>;
35 
36 DESCRIPTION
37 <<log10>> returns the base 10 logarithm of <[x]>.
38 It is implemented as <<log(<[x]>) / log(10)>>.
39 
40 <<log10f>> is identical, save that it takes and returns <<float>> values.
41 
42 RETURNS
43 <<log10>> and <<log10f>> return the calculated value.
44 
45 See the description of <<log>> for information on errors.
46 
47 PORTABILITY
48 <<log10>> is ANSI C.  <<log10f>> is an extension.
49 
50  */
51 
52 /*
53  * wrapper log10(X)
54  */
55 
56 #include "fdlibm.h"
57 #include <errno.h>
58 
59 #ifndef _DOUBLE_IS_32BITS
60 
61 #ifdef __STDC__
log10(double x)62 	double log10(double x)		/* wrapper log10 */
63 #else
64 	double log10(x)			/* wrapper log10 */
65 	double x;
66 #endif
67 {
68 #ifdef _IEEE_LIBM
69 	return __ieee754_log10(x);
70 #else
71 	double z;
72 	struct exception exc;
73 	z = __ieee754_log10(x);
74 	if(_LIB_VERSION == _IEEE_ || isnan(x)) return z;
75 	if(x<=0.0) {
76 #ifndef HUGE_VAL
77 #define HUGE_VAL inf
78 	    double inf = 0.0;
79 
80 	    SET_HIGH_WORD(inf,0x7ff00000);	/* set inf to infinite */
81 #endif
82 	    exc.name = "log10";
83 	    exc.err = 0;
84 	    exc.arg1 = x;
85 	    exc.arg2 = x;
86 	    if (_LIB_VERSION == _SVID_)
87                exc.retval = -HUGE;
88 	    else
89 	       exc.retval = -HUGE_VAL;
90 	    if(x==0.0) {
91 	        /* log10(0) */
92 	        exc.type = SING;
93 	        if (_LIB_VERSION == _POSIX_)
94 	           errno = ERANGE;
95 	        else if (!matherr(&exc)) {
96 	           errno = EDOM;
97 	        }
98 	    } else {
99 	        /* log10(x<0) */
100 	        exc.type = DOMAIN;
101 	        if (_LIB_VERSION == _POSIX_)
102 	           errno = EDOM;
103 	        else if (!matherr(&exc)) {
104 	           errno = EDOM;
105 	        }
106             }
107 	    if (exc.err != 0)
108                errno = exc.err;
109             return exc.retval;
110 	} else
111 	    return z;
112 #endif
113 }
114 
115 #endif /* defined(_DOUBLE_IS_32BITS) */
116