1 /* ef_log10.c -- float version of e_log10.c.
2  * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3  */
4 
5 /*
6  * ====================================================
7  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8  *
9  * Developed at SunPro, a Sun Microsystems, Inc. business.
10  * Permission to use, copy, modify, and distribute this
11  * software is freely granted, provided that this notice
12  * is preserved.
13  * ====================================================
14  */
15 
16 #include "fdlibm.h"
17 
18 static const float two25 = 3.3554432000e+07, /* 0x4c000000 */
19     ivln10 = 4.3429449201e-01, /* 0x3ede5bd9 */
20     log10_2hi = 3.0102920532e-01, /* 0x3e9a2080 */
21     log10_2lo = 7.9034151668e-07; /* 0x355427db */
22 
23 float
log10f(float x)24 log10f(float x)
25 {
26     float y, z;
27     __int32_t i, k, hx;
28 
29     GET_FLOAT_WORD(hx, x);
30 
31     k = 0;
32     if (FLT_UWORD_IS_ZERO(hx & 0x7fffffff))
33         return __math_divzerof(1); /* log(+-0)=-inf */
34     if (hx < 0)
35         return __math_invalidf(x); /* log(-#) = NaN */
36     if (!FLT_UWORD_IS_FINITE(hx))
37         return x + x;
38     if (FLT_UWORD_IS_SUBNORMAL(hx)) {
39         k -= 25;
40         x *= two25; /* subnormal number, scale up x */
41         GET_FLOAT_WORD(hx, x);
42     }
43     k += (hx >> 23) - 127;
44     i = ((__uint32_t)k & 0x80000000) >> 31;
45     hx = (hx & 0x007fffff) | ((0x7f - i) << 23);
46     y = (float)(k + i);
47     SET_FLOAT_WORD(x, hx);
48     z = y * log10_2lo + ivln10 * logf(x);
49     return z + y * log10_2hi;
50 }
51 
52 _MATH_ALIAS_f_f(log10)
53