Print this page
11210 libm should be cstyle(1ONBLD) clean
*** 16,28 ****
--- 16,30 ----
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
+
/*
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
*/
+
/*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
*** 34,44 ****
#if defined(__i386) && !defined(__amd64)
extern int __swapRP(int);
#endif
- /* INDENT OFF */
static const double
ln2 = 6.93147180559945286227e-01, /* 0x3fe62e42, 0xfefa39ef */
invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */
dtwo = 2.0,
done = 1.0,
--- 36,45 ----
*** 84,132 ****
1.91520656139714740007e+00, /* 3FFEA4AFA2A490DA */
1.95714412417540017941e+00, /* 3FFF50765B6E4540 */
};
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;
! /* INDENT ON */
float
! powf(float x, float y) {
float fx = x, fy = y;
float fz;
int ix, iy, jx, jy, k, iw, yisint;
ix = *(int *)&x;
--- 85,118 ----
1.91520656139714740007e+00, /* 3FFEA4AFA2A490DA */
1.95714412417540017941e+00, /* 3FFF50765B6E4540 */
};
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;
*** 138,163 ****
return (one); /* x**+-0 = 1 */
else if (ix == 0x3f800000 && (__xpg6 & _C99SUSv3_pow) != 0)
return (one); /* C99: 1**anything = 1 */
else if (((0x7f800000 - jx) | (0x7f800000 - jy)) < 0)
return (fx * fy); /* at least one of x or y is NaN */
! /* includes Sun: 1**NaN = NaN */
! /* INDENT OFF */
/*
* determine if y is an odd int
* yisint = 0 ... y is not an integer
* yisint = 1 ... y is an odd int
* yisint = 2 ... y is an even int
*/
- /* INDENT ON */
yisint = 0;
if (ix < 0) {
if (jy >= 0x4b800000) {
yisint = 2; /* |y|>=2**24: y must be even */
} else if (jy >= 0x3f800000) {
k = (jy >> 23) - 0x7f; /* exponent */
iw = jy >> (23 - k);
if ((iw << (23 - k)) == jy)
yisint = 2 - (iw & 1);
}
}
--- 124,153 ----
return (one); /* x**+-0 = 1 */
else if (ix == 0x3f800000 && (__xpg6 & _C99SUSv3_pow) != 0)
return (one); /* C99: 1**anything = 1 */
else if (((0x7f800000 - jx) | (0x7f800000 - jy)) < 0)
return (fx * fy); /* at least one of x or y is NaN */
!
! /*
! * includes Sun: 1**NaN = NaN
! */
!
/*
* determine if y is an odd int
* yisint = 0 ... y is not an integer
* yisint = 1 ... y is an odd int
* yisint = 2 ... y is an even int
*/
yisint = 0;
+
if (ix < 0) {
if (jy >= 0x4b800000) {
yisint = 2; /* |y|>=2**24: y must be even */
} else if (jy >= 0x3f800000) {
k = (jy >> 23) - 0x7f; /* exponent */
iw = jy >> (23 - k);
+
if ((iw << (23 - k)) == jy)
yisint = 2 - (iw & 1);
}
}
*** 168,177 ****
--- 158,168 ----
if ((__xpg6 & _C99SUSv3_pow) != 0)
fz = one;
/* C99: (-1)**+-inf is 1 */
else
fz = fy - fy;
+
/* Sun: (+-1)**+-inf = NaN */
} else if (jx > 0x3f800000) {
/* (|x|>1)**+,-inf = inf,0 */
if (iy > 0)
fz = fy;
*** 181,194 ****
--- 172,187 ----
if (iy < 0)
fz = -fy;
else
fz = zero;
}
+
return (fz);
} else if (jy == 0x3f800000) { /* y is +-1 */
if (iy < 0)
fx = one / fx; /* y is -1 */
+
return (fx);
} else if (iy == 0x40000000) { /* y is 2 */
return (fx * fx);
} else if (iy == 0x3f000000) { /* y is 0.5 */
if (jx != 0 && jx != 0x7f800000)
*** 199,220 ****
--- 192,216 ----
/* special value of x */
if ((jx & ~0x7f800000) == 0) {
if (jx == 0x7f800000 || jx == 0 || jx == 0x3f800000) {
/* x is +-0,+-inf,-1; set fz = |x|**y */
*(int *)&fz = jx;
+
if (iy < 0)
fz = one / fz;
+
if (ix < 0) {
if (jx == 0x3f800000 && yisint == 0) {
/* (-1)**non-int is NaN */
fz = zero;
fz /= fz;
} else if (yisint == 1) {
/* (x<0)**odd = -(|x|**odd) */
fz = -fz;
}
}
+
return (fz);
}
}
/* (x<0)**(non-int) is NaN */
*** 229,238 ****
--- 225,235 ----
* fz = (float) exp(((double) fy) * log((double) fx));
*/
{
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;
*** 245,267 ****
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);
/* compute exp2(dz=y*ln(x)) */
i = pz[HIWORD];
if ((i & ~0x80000000) >= 0x40640000) { /* |z| >= 160.0 */
! fz = (i > 0)? huge : tiny;
if (ix < 0 && yisint == 1)
fz *= -fz; /* (-ve)**(odd int) */
else
fz *= fz;
#if defined(__i386) && !defined(__amd64)
if (rp != fp_extended)
(void) __swapRP(rp);
#endif
return (fz);
--- 242,268 ----
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);
/* compute exp2(dz=y*ln(x)) */
i = pz[HIWORD];
+
if ((i & ~0x80000000) >= 0x40640000) { /* |z| >= 160.0 */
! fz = (i > 0) ? huge : tiny;
!
if (ix < 0 && yisint == 1)
fz *= -fz; /* (-ve)**(odd int) */
else
fz *= fz;
+
#if defined(__i386) && !defined(__amd64)
if (rp != fp_extended)
(void) __swapRP(rp);
#endif
return (fz);
*** 270,288 ****
--- 271,292 ----
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
}
/* end of computing exp(y*log(x)) */
if (ix < 0 && yisint == 1)
fz = -fz; /* (-ve)**(odd int) */
+
return (fz);
}