diff options
author | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2012-05-14 16:49:42 -0300 |
---|---|---|
committer | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2012-05-15 16:34:41 -0300 |
commit | 9ea01d93f7e08463febd23ad758e28973524f9be (patch) | |
tree | d4647059ad4bc6d3a13ece5c4ff06f925ad246fc /sysdeps/ieee754/dbl-64/e_log2.c | |
parent | 02a9193863a929b06ccebe394dcf5a30103eb1d3 (diff) | |
download | glibc-9ea01d93f7e08463febd23ad758e28973524f9be.tar glibc-9ea01d93f7e08463febd23ad758e28973524f9be.tar.gz glibc-9ea01d93f7e08463febd23ad758e28973524f9be.tar.bz2 glibc-9ea01d93f7e08463febd23ad758e28973524f9be.zip |
Log2 and log10 for wordsize-64.
This patch also fixes indentation on default dbl-64 code.
Diffstat (limited to 'sysdeps/ieee754/dbl-64/e_log2.c')
-rw-r--r-- | sysdeps/ieee754/dbl-64/e_log2.c | 114 |
1 files changed, 61 insertions, 53 deletions
diff --git a/sysdeps/ieee754/dbl-64/e_log2.c b/sysdeps/ieee754/dbl-64/e_log2.c index 6891ee2389..4d5cab0ed3 100644 --- a/sysdeps/ieee754/dbl-64/e_log2.c +++ b/sysdeps/ieee754/dbl-64/e_log2.c @@ -57,64 +57,72 @@ #include <math.h> #include <math_private.h> -static const double -ln2 = 0.69314718055994530942, -two54 = 1.80143985094819840000e+16, /* 43500000 00000000 */ -Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */ -Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */ -Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */ -Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */ -Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */ -Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */ -Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ +static const double ln2 = 0.69314718055994530942; +static const double two54 = 1.80143985094819840000e+16; /* 43500000 00000000 */ +static const double Lg1 = 6.666666666666735130e-01; /* 3FE55555 55555593 */ +static const double Lg2 = 3.999999999940941908e-01; /* 3FD99999 9997FA04 */ +static const double Lg3 = 2.857142874366239149e-01; /* 3FD24924 94229359 */ +static const double Lg4 = 2.222219843214978396e-01; /* 3FCC71C5 1D8E78AF */ +static const double Lg5 = 1.818357216161805012e-01; /* 3FC74664 96CB03DE */ +static const double Lg6 = 1.531383769920937332e-01; /* 3FC39A09 D078C69F */ +static const double Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ -static const double zero = 0.0; +static const double zero = 0.0; double -__ieee754_log2(double x) +__ieee754_log2 (double x) { - double hfsq,f,s,z,R,w,t1,t2,dk; - int32_t k,hx,i,j; - u_int32_t lx; + double hfsq, f, s, z, R, w, t1, t2, dk; + int32_t k, hx, i, j; + u_int32_t lx; - EXTRACT_WORDS(hx,lx,x); + EXTRACT_WORDS (hx, lx, x); - k=0; - if (hx < 0x00100000) { /* x < 2**-1022 */ - if (__builtin_expect(((hx&0x7fffffff)|lx)==0, 0)) - return -two54/(x-x); /* log(+-0)=-inf */ - if (__builtin_expect(hx<0, 0)) - return (x-x)/(x-x); /* log(-#) = NaN */ - k -= 54; x *= two54; /* subnormal number, scale up x */ - GET_HIGH_WORD(hx,x); - } - if (__builtin_expect(hx >= 0x7ff00000, 0)) return x+x; - k += (hx>>20)-1023; - hx &= 0x000fffff; - i = (hx+0x95f64)&0x100000; - SET_HIGH_WORD(x,hx|(i^0x3ff00000)); /* normalize x or x/2 */ - k += (i>>20); - dk = (double) k; - f = x-1.0; - if((0x000fffff&(2+hx))<3) { /* |f| < 2**-20 */ - if(f==zero) return dk; - R = f*f*(0.5-0.33333333333333333*f); - return dk-(R-f)/ln2; - } - s = f/(2.0+f); - z = s*s; - i = hx-0x6147a; - w = z*z; - j = 0x6b851-hx; - t1= w*(Lg2+w*(Lg4+w*Lg6)); - t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); - i |= j; - R = t2+t1; - if(i>0) { - hfsq=0.5*f*f; - return dk-((hfsq-(s*(hfsq+R)))-f)/ln2; - } else { - return dk-((s*(f-R))-f)/ln2; - } + k = 0; + if (hx < 0x00100000) + { /* x < 2**-1022 */ + if (__builtin_expect (((hx & 0x7fffffff) | lx) == 0, 0)) + return -two54 / (x - x); /* log(+-0)=-inf */ + if (__builtin_expect (hx < 0, 0)) + return (x - x) / (x - x); /* log(-#) = NaN */ + k -= 54; + x *= two54; /* subnormal number, scale up x */ + GET_HIGH_WORD (hx, x); + } + if (__builtin_expect (hx >= 0x7ff00000, 0)) + return x + x; + k += (hx >> 20) - 1023; + hx &= 0x000fffff; + i = (hx + 0x95f64) & 0x100000; + SET_HIGH_WORD (x, hx | (i ^ 0x3ff00000)); /* normalize x or x/2 */ + k += (i >> 20); + dk = (double) k; + f = x - 1.0; + if ((0x000fffff & (2 + hx)) < 3) + { /* |f| < 2**-20 */ + if (f == zero) + return dk; + R = f * f * (0.5 - 0.33333333333333333 * f); + return dk - (R - f) / ln2; + } + s = f / (2.0 + f); + z = s * s; + i = hx - 0x6147a; + w = z * z; + j = 0x6b851 - hx; + t1 = w * (Lg2 + w * (Lg4 + w * Lg6)); + t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7))); + i |= j; + R = t2 + t1; + if (i > 0) + { + hfsq = 0.5 * f * f; + return dk - ((hfsq - (s * (hfsq + R))) - f) / ln2; + } + else + { + return dk - ((s * (f - R)) - f) / ln2; + } } + strong_alias (__ieee754_log2, __log2_finite) |