19 static const volatile float huge = 1.0e+30, tiny = 1.0e-30;
23 dp_h[] = { 0.0, 5.84960938e-01,},
24 dp_l[] = { 0.0, 1.56322085e-06,},
30 L1 = 6.0000002384e-01,
31 L2 = 4.2857143283e-01,
32 L3 = 3.3333334327e-01,
33 L4 = 2.7272811532e-01,
34 L5 = 2.3066075146e-01,
35 L6 = 2.0697501302e-01,
36 P1 = 1.6666667163e-01,
37 P2 = -2.7777778450e-03,
38 P3 = 6.6137559770e-05,
39 P4 = -1.6533901999e-06,
40 P5 = 4.1381369442e-08,
41 lg2 = 6.9314718246e-01,
42 lg2_h = 6.93145752e-01,
43 lg2_l = 1.42860654e-06,
44 ovt = 4.2995665694e-08,
45 cp = 9.6179670095e-01,
46 cp_h = 9.6179199219e-01,
47 cp_l = 4.7017383622e-06,
48 ivln2 = 1.4426950216e+00,
49 ivln2_h = 1.4426879883e+00,
50 ivln2_l = 7.0526075433e-06;
55 float z,ax,z_h,z_l,p_h,p_l;
56 float yy1,t1,t2,r,s,t,u,v,w;
62 ix = hx&0x7fffffff; iy = hy&0x7fffffff;
79 if(iy>=0x4b800000) yisint = 2;
80 else if(iy>=0x3f800000) {
83 if((j<<(23-k))==iy) yisint = 2-(j&1);
91 else if (ix > 0x3f800000)
92 return (hy>=0)? y: zero;
94 return (hy<0)?-y: zero;
97 if(hy<0)
return one/x;
else return x;
99 if(hy==0x40000000)
return x*x;
107 if(ix==0x7f800000||ix==0||ix==0x3f800000){
111 if(((ix-0x3f800000)|yisint)==0) {
120 if(((((
u_int32_t)hx>>31)-1)|yisint)==0)
return (x-x)/(x-x);
125 if(ix<0x3f7ffff8)
return (hy<0)? huge*huge:tiny*tiny;
126 if(ix>0x3f800007)
return (hy>0)? huge*huge:tiny*tiny;
130 w = (t*t)*((
float)0.5-t*((float)0.333333333333-t*(
float)0.25));
132 v = t*ivln2_l-w*ivln2;
138 float s2,s_h,s_l,t_h,t_l;
143 n += ((ix)>>23)-0x7f;
148 else if(j<0x5db3d7) k=1;
149 else {k=0;n+=1;ix -= 0x00800000;}
161 t_l = ax - (t_h-bp[k]);
162 s_l = v*((u-s_h*t_h)-s_h*t_l);
165 r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6)))));
168 t_h = (float)3.0+s2+r;
171 t_l = r-((t_h-(float)3.0)-s2);
181 z_l = cp_l*p_h+p_l*cp+dp_l[k];
184 t1 = (((z_h+z_l)+dp_h[k])+t);
187 t2 = z_l-(((t1-t)-dp_h[k])-z_h);
191 if(((((
u_int32_t)hx>>31)-1)|(yisint-1))==0)
197 p_l = (y-yy1)*t1+y*t2;
203 else if (j==0x43000000) {
204 if(p_l+ovt>z-p_h)
return s*huge*huge;
206 else if ((j&0x7fffffff)>0x43160000)
208 else if (j==0xc3160000){
209 if(p_l<=z-p_h)
return s*tiny*tiny;
218 n = j+(0x00800000>>(k+1));
219 k = ((n&0x7fffffff)>>23)-0x7f;
221 n = ((n&0x007fffff)|0x00800000)>>(23-k);
229 v = (p_l-(t-p_h))*lg2+t*lg2_l;
233 t1 = z - t*(
P1+t*(
P2+t*(
P3+t*(
P4+t*P5))));
234 r = (z*t1)/(t1-two)-(w+z*w);
238 if((j>>23)<=0) z =
scalbnf(z,n);
float powf(float x, float y)
#define SET_FLOAT_WORD(d, i)
#define GET_FLOAT_WORD(i, d)