1:
2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
12:
13:
14:
15: #include <sys/cdefs.h>
16: #include <float.h>
17: #include <math.h>
18:
19: #include "math_private.h"
20:
21: static const double
22: ln2 = 0.6931471805599452862268,
23: two54 = 1.80143985094819840000e+16,
24: Lg1 = 6.666666666666735130e-01,
25: Lg2 = 3.999999999940941908e-01,
26: Lg3 = 2.857142874366239149e-01,
27: Lg4 = 2.222219843214978396e-01,
28: Lg5 = 1.818357216161805012e-01,
29: Lg6 = 1.531383769920937332e-01,
30: Lg7 = 1.479819860511658591e-01;
31:
32: static const double zero = 0.0;
33:
34: double
35: log2(double x)
36: {
37: double hfsq,f,s,z,R,w,t1,t2,dk;
38: int32_t k,hx,i,j;
39: u_int32_t lx;
40:
41: EXTRACT_WORDS(hx,lx,x);
42:
43: k=0;
44: if (hx < 0x00100000) {
45: if (((hx&0x7fffffff)|lx)==0)
46: return -two54/zero;
47: if (hx<0) return (x-x)/zero;
48: k -= 54; x *= two54;
49: GET_HIGH_WORD(hx,x);
50: }
51: if (hx >= 0x7ff00000) return x+x;
52: k += (hx>>20)-1023;
53: hx &= 0x000fffff;
54: i = (hx+0x95f64)&0x100000;
55: SET_HIGH_WORD(x,hx|(i^0x3ff00000));
56: k += (i>>20);
57: f = x-1.0;
58: dk = (double)k;
59: if((0x000fffff&(2+hx))<3) {
60: if (f==zero)
61: return (dk);
62: R = f*f*(0.5-0.33333333333333333*f);
63: return (dk-(R-f)/ln2);
64: }
65: s = f/(2.0+f);
66: z = s*s;
67: i = hx-0x6147a;
68: w = z*z;
69: j = 0x6b851-hx;
70: t1= w*(Lg2+w*(Lg4+w*Lg6));
71: t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
72: i |= j;
73: R = t2+t1;
74: if(i>0) {
75: hfsq=0.5*f*f;
76: return (dk-(hfsq-s*(hfsq+R)-f)/ln2);
77: } else
78: return (dk-((s*(f-R))-f)/ln2);
79: }
80:
81: #if LDBL_MANT_DIG == 53
82: #ifdef lint
83:
84: long double log2l(long double);
85: #else
86: __weak_alias(log2l, log2);
87: #endif
88: #endif