32 #ifdef POK_NEEDS_LIBMATH
35 #include "math_private.h"
37 static const float huge = 1.0e+30, tiny = 1.0e-30;
41 dp_h[] = { 0.0, 5.84960938e-01,},
42 dp_l[] = { 0.0, 1.56322085e-06,},
48 L1 = 6.0000002384e-01,
49 L2 = 4.2857143283e-01,
50 L3 = 3.3333334327e-01,
51 L4 = 2.7272811532e-01,
52 L5 = 2.3066075146e-01,
53 L6 = 2.0697501302e-01,
54 P1 = 1.6666667163e-01,
55 P2 = -2.7777778450e-03,
56 P3 = 6.6137559770e-05,
57 P4 = -1.6533901999e-06,
58 P5 = 4.1381369442e-08,
59 lg2 = 6.9314718246e-01,
60 lg2_h = 6.93145752e-01,
61 lg2_l = 1.42860654e-06,
62 ovt = 4.2995665694e-08,
63 cp = 9.6179670095e-01,
64 cp_h = 9.6179199219e-01,
65 cp_l = 4.7017383622e-06,
66 ivln2 = 1.4426950216e+00,
67 ivln2_h = 1.4426879883e+00,
68 ivln2_l = 7.0526075433e-06;
71 __ieee754_powf(
float x,
float y)
73 float z,ax,z_h,z_l,p_h,p_l;
74 float yy1,t1,t2,r,s,t,u,v,w;
75 int32_t i,j,k,yisint,n;
76 int32_t hx,hy,ix,iy,is;
80 ix = hx&0x7fffffff; iy = hy&0x7fffffff;
97 if(iy>=0x4b800000) yisint = 2;
98 else if(iy>=0x3f800000) {
101 if((j<<(23-k))==iy) yisint = 2-(j&1);
106 if (iy==0x7f800000) {
109 else if (ix > 0x3f800000)
110 return (hy>=0)? y: zero;
112 return (hy<0)?-y: zero;
115 if(hy<0)
return one/x;
else return x;
117 if(hy==0x40000000)
return x*x;
120 return __ieee754_sqrtf(x);
125 if(ix==0x7f800000||ix==0||ix==0x3f800000){
129 if(((ix-0x3f800000)|yisint)==0) {
138 if(((((uint32_t)hx>>31)-1)|yisint)==0)
return (x-x)/(x-x);
143 if(ix<0x3f7ffff8)
return (hy<0)? huge*huge:tiny*tiny;
144 if(ix>0x3f800007)
return (hy>0)? huge*huge:tiny*tiny;
148 w = (t*t)*((
float)0.5-t*((float)0.333333333333-t*(
float)0.25));
150 v = t*ivln2_l-w*ivln2;
152 GET_FLOAT_WORD(is,t1);
153 SET_FLOAT_WORD(t1,is&0xfffff000);
156 float s2,s_h,s_l,t_h,t_l;
160 {ax *= two24; n -= 24; GET_FLOAT_WORD(ix,ax); }
161 n += ((ix)>>23)-0x7f;
166 else if(j<0x5db3d7) k=1;
167 else {k=0;n+=1;ix -= 0x00800000;}
168 SET_FLOAT_WORD(ax,ix);
175 GET_FLOAT_WORD(is,s_h);
176 SET_FLOAT_WORD(s_h,is&0xfffff000);
178 SET_FLOAT_WORD(t_h,((ix>>1)|0x20000000)+0x0040000+(k<<21));
179 t_l = ax - (t_h-bp[k]);
180 s_l = v*((u-s_h*t_h)-s_h*t_l);
183 r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6)))));
186 t_h = (float)3.0+s2+r;
187 GET_FLOAT_WORD(is,t_h);
188 SET_FLOAT_WORD(t_h,is&0xfffff000);
189 t_l = r-((t_h-(float)3.0)-s2);
195 GET_FLOAT_WORD(is,p_h);
196 SET_FLOAT_WORD(p_h,is&0xfffff000);
199 z_l = cp_l*p_h+p_l*cp+dp_l[k];
202 t1 = (((z_h+z_l)+dp_h[k])+t);
203 GET_FLOAT_WORD(is,t1);
204 SET_FLOAT_WORD(t1,is&0xfffff000);
205 t2 = z_l-(((t1-t)-dp_h[k])-z_h);
209 if(((((uint32_t)hx>>31)-1)|(yisint-1))==0)
213 GET_FLOAT_WORD(is,y);
214 SET_FLOAT_WORD(yy1,is&0xfffff000);
215 p_l = (y-yy1)*t1+y*t2;
221 else if (j==0x43000000) {
222 if(p_l+ovt>z-p_h)
return s*huge*huge;
224 else if ((uint32_t)j==0xc3160000){
225 if(p_l<=z-p_h)
return s*tiny*tiny;
227 else if ((j&0x7fffffff)>0x43160000)
236 n = j+(0x00800000>>(k+1));
237 k = ((n&0x7fffffff)>>23)-0x7f;
238 SET_FLOAT_WORD(t,n&~(0x007fffff>>k));
239 n = ((n&0x007fffff)|0x00800000)>>(23-k);
244 GET_FLOAT_WORD(is,t);
245 SET_FLOAT_WORD(t,is&0xfffff000);
247 v = (p_l-(t-p_h))*lg2+t*lg2_l;
251 t1 = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
252 r = (z*t1)/(t1-two)-(w+z*w);
256 if((j>>23)<=0) z = scalbnf(z,n);
257 else SET_FLOAT_WORD(z,j);