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