#pragma weak __powf = powf
#include "libm.h"
#include "xpg6.h"
#define _C99SUSv3_pow _C99SUSv3_pow_treats_Inf_as_an_even_int
#if defined(__i386) && !defined(__amd64)
extern int __swapRP(int);
#endif
static const double
ln2 = 6.93147180559945286227e-01,
invln2 = 1.44269504088896338700e+00,
dtwo = 2.0,
done = 1.0,
dhalf = 0.5,
d32 = 32.0,
d1_32 = 0.03125,
A0 = 1.999999999813723303647511146995966439250e+0000,
A1 = 6.666910817935858533770138657139665608610e-0001,
t0 = 2.000000000004777489262405315073203746943e+0000,
t1 = 1.666663408349926379873111932994250726307e-0001;
static const double S[] = {
1.00000000000000000000e+00,
1.02189714865411662714e+00,
1.04427378242741375480e+00,
1.06714040067682369717e+00,
1.09050773266525768967e+00,
1.11438674259589243221e+00,
1.13878863475669156458e+00,
1.16372485877757747552e+00,
1.18920711500272102690e+00,
1.21524735998046895524e+00,
1.24185781207348400201e+00,
1.26905095719173321989e+00,
1.29683955465100964055e+00,
1.32523664315974132322e+00,
1.35425554693689265129e+00,
1.38390988196383202258e+00,
1.41421356237309514547e+00,
1.44518080697704665027e+00,
1.47682614593949934623e+00,
1.50916442759342284141e+00,
1.54221082540794074411e+00,
1.57598084510788649659e+00,
1.61049033194925428347e+00,
1.64575547815396494578e+00,
1.68179283050742900407e+00,
1.71861929812247793414e+00,
1.75625216037329945351e+00,
1.79470907500310716820e+00,
1.83400808640934243066e+00,
1.87416763411029996256e+00,
1.91520656139714740007e+00,
1.95714412417540017941e+00,
};
static const double TBL[] = {
0.00000000000000000e+00,
3.07716586667536873e-02,
6.06246218164348399e-02,
8.96121586896871380e-02,
1.17783035656383456e-01,
1.45182009844497889e-01,
1.71850256926659228e-01,
1.97825743329919868e-01,
2.23143551314209765e-01,
2.47836163904581269e-01,
2.71933715483641758e-01,
2.95464212893835898e-01,
3.18453731118534589e-01,
3.40926586970593193e-01,
3.62905493689368475e-01,
3.84411698910332056e-01,
4.05465108108164385e-01,
4.26084395310900088e-01,
4.46287102628419530e-01,
4.66089729924599239e-01,
4.85507815781700824e-01,
5.04556010752395312e-01,
5.23248143764547868e-01,
5.41597282432744409e-01,
5.59615787935422659e-01,
5.77315365034823613e-01,
5.94707107746692776e-01,
6.11801541105992941e-01,
6.28608659422374094e-01,
6.45137961373584701e-01,
6.61398482245365016e-01,
6.77398823591806143e-01,
};
static const float zero = 0.0F, one = 1.0F, huge = 1.0e25f, tiny = 1.0e-25f;
float
powf(float x, float y) {
float fx = x, fy = y;
float fz;
int ix, iy, jx, jy, k, iw, yisint;
ix = *(int *)&x;
iy = *(int *)&y;
jx = ix & ~0x80000000;
jy = iy & ~0x80000000;
if (jy == 0)
return (one);
else if (ix == 0x3f800000 && (__xpg6 & _C99SUSv3_pow) != 0)
return (one);
else if (((0x7f800000 - jx) | (0x7f800000 - jy)) < 0)
return (fx * fy);
yisint = 0;
if (ix < 0) {
if (jy >= 0x4b800000) {
yisint = 2;
} else if (jy >= 0x3f800000) {
k = (jy >> 23) - 0x7f;
iw = jy >> (23 - k);
if ((iw << (23 - k)) == jy)
yisint = 2 - (iw & 1);
}
}
if ((jy & ~0x7f800000) == 0) {
if (jy == 0x7f800000) {
if (jx == 0x3f800000) {
if ((__xpg6 & _C99SUSv3_pow) != 0)
fz = one;
else
fz = fy - fy;
} else if (jx > 0x3f800000) {
if (iy > 0)
fz = fy;
else
fz = zero;
} else {
if (iy < 0)
fz = -fy;
else
fz = zero;
}
return (fz);
} else if (jy == 0x3f800000) {
if (iy < 0)
fx = one / fx;
return (fx);
} else if (iy == 0x40000000) {
return (fx * fx);
} else if (iy == 0x3f000000) {
if (jx != 0 && jx != 0x7f800000)
return (sqrtf(x));
}
}
if ((jx & ~0x7f800000) == 0) {
if (jx == 0x7f800000 || jx == 0 || jx == 0x3f800000) {
*(int *)&fz = jx;
if (iy < 0)
fz = one / fz;
if (ix < 0) {
if (jx == 0x3f800000 && yisint == 0) {
fz = zero;
fz /= fz;
} else if (yisint == 1) {
fz = -fz;
}
}
return (fz);
}
}
if (ix < 0 && yisint == 0) {
fz = zero;
return (fz / fz);
}
{
double dx, dy, dz, ds;
int *px = (int *)&dx, *pz = (int *)&dz, i, n, m;
#if defined(__i386) && !defined(__amd64)
int rp = __swapRP(fp_extended);
#endif
fx = *(float *)&jx;
dx = (double)fx;
i = px[HIWORD] + 0x4000;
n = (i >> 20) - 0x3ff;
pz[HIWORD] = i & 0xffff8000;
pz[LOWORD] = 0;
ds = (dx - dz) / (dx + dz);
i = (i >> 15) & 0x1f;
dz = ds * ds;
dy = invln2 * (TBL[i] + ds * (A0 + dz * A1));
if (n == 0)
dz = (double)fy * dy;
else
dz = (double)fy * (dy + (double)n);
i = pz[HIWORD];
if ((i & ~0x80000000) >= 0x40640000) {
fz = (i > 0)? huge : tiny;
if (ix < 0 && yisint == 1)
fz *= -fz;
else
fz *= fz;
#if defined(__i386) && !defined(__amd64)
if (rp != fp_extended)
(void) __swapRP(rp);
#endif
return (fz);
}
n = (int)(d32 * dz + (i > 0 ? dhalf : -dhalf));
i = n & 0x1f;
m = n >> 5;
dy = ln2 * (dz - d1_32 * (double)n);
dx = S[i] * (done - (dtwo * dy) / (dy * (done - dy * t1) - t0));
if (m != 0)
px[HIWORD] += m << 20;
fz = (float)dx;
#if defined(__i386) && !defined(__amd64)
if (rp != fp_extended)
(void) __swapRP(rp);
#endif
}
if (ix < 0 && yisint == 1)
fz = -fz;
return (fz);
}