diff options
author | das <das@FreeBSD.org> | 2011-10-21 06:28:47 +0000 |
---|---|---|
committer | das <das@FreeBSD.org> | 2011-10-21 06:28:47 +0000 |
commit | f66ae96060daab6b90cb9d24fa049e4c17f3b80f (patch) | |
tree | ead8ba08a5f00879a3fa0436cc24c942c1a6477a | |
parent | 791a3ff0bf568d12e5a870ebbcfb9877804bac46 (diff) | |
download | FreeBSD-src-f66ae96060daab6b90cb9d24fa049e4c17f3b80f.zip FreeBSD-src-f66ae96060daab6b90cb9d24fa049e4c17f3b80f.tar.gz |
Use __ldexp_exp() to simplify things and improve accuracy for x near
the overflow threshold.
-rw-r--r-- | lib/msun/src/e_cosh.c | 10 | ||||
-rw-r--r-- | lib/msun/src/e_coshf.c | 7 | ||||
-rw-r--r-- | lib/msun/src/e_sinh.c | 11 | ||||
-rw-r--r-- | lib/msun/src/e_sinhf.c | 9 |
4 files changed, 10 insertions, 27 deletions
diff --git a/lib/msun/src/e_cosh.c b/lib/msun/src/e_cosh.c index 11e6590..a363695 100644 --- a/lib/msun/src/e_cosh.c +++ b/lib/msun/src/e_cosh.c @@ -45,7 +45,6 @@ __ieee754_cosh(double x) { double t,w; int32_t ix; - u_int32_t lx; /* High word of |x|. */ GET_HIGH_WORD(ix,x); @@ -72,13 +71,8 @@ __ieee754_cosh(double x) if (ix < 0x40862E42) return half*__ieee754_exp(fabs(x)); /* |x| in [log(maxdouble), overflowthresold] */ - GET_LOW_WORD(lx,x); - if (ix<0x408633CE || - ((ix==0x408633ce)&&(lx<=(u_int32_t)0x8fb9f87d))) { - w = __ieee754_exp(half*fabs(x)); - t = half*w; - return t*w; - } + if (ix<=0x408633CE) + return __ldexp_exp(fabs(x), -1); /* |x| > overflowthresold, cosh(x) overflow */ return huge*huge; diff --git a/lib/msun/src/e_coshf.c b/lib/msun/src/e_coshf.c index 4a1d499..95a0d6e 100644 --- a/lib/msun/src/e_coshf.c +++ b/lib/msun/src/e_coshf.c @@ -51,11 +51,8 @@ __ieee754_coshf(float x) if (ix < 0x42b17217) return half*__ieee754_expf(fabsf(x)); /* |x| in [log(maxfloat), overflowthresold] */ - if (ix<=0x42b2d4fc) { - w = __ieee754_expf(half*fabsf(x)); - t = half*w; - return t*w; - } + if (ix<=0x42b2d4fc) + return __ldexp_expf(fabsf(x), -1); /* |x| > overflowthresold, cosh(x) overflow */ return huge*huge; diff --git a/lib/msun/src/e_sinh.c b/lib/msun/src/e_sinh.c index afb8e43..17442d0 100644 --- a/lib/msun/src/e_sinh.c +++ b/lib/msun/src/e_sinh.c @@ -40,9 +40,8 @@ static const double one = 1.0, shuge = 1.0e307; double __ieee754_sinh(double x) { - double t,w,h; + double t,h; int32_t ix,jx; - u_int32_t lx; /* High word of |x|. */ GET_HIGH_WORD(jx,x); @@ -66,12 +65,8 @@ __ieee754_sinh(double x) if (ix < 0x40862E42) return h*__ieee754_exp(fabs(x)); /* |x| in [log(maxdouble), overflowthresold] */ - GET_LOW_WORD(lx,x); - if (ix<0x408633CE || ((ix==0x408633ce)&&(lx<=(u_int32_t)0x8fb9f87d))) { - w = __ieee754_exp(0.5*fabs(x)); - t = h*w; - return t*w; - } + if (ix<=0x408633CE) + return h*2.0*__ldexp_exp(fabs(x), -1); /* |x| > overflowthresold, sinh(x) overflow */ return x*shuge; diff --git a/lib/msun/src/e_sinhf.c b/lib/msun/src/e_sinhf.c index 0f96b2b..1be2dc3 100644 --- a/lib/msun/src/e_sinhf.c +++ b/lib/msun/src/e_sinhf.c @@ -24,7 +24,7 @@ static const float one = 1.0, shuge = 1.0e37; float __ieee754_sinhf(float x) { - float t,w,h; + float t,h; int32_t ix,jx; GET_FLOAT_WORD(jx,x); @@ -48,11 +48,8 @@ __ieee754_sinhf(float x) if (ix < 0x42b17217) return h*__ieee754_expf(fabsf(x)); /* |x| in [logf(maxfloat), overflowthresold] */ - if (ix<=0x42b2d4fc) { - w = __ieee754_expf((float)0.5*fabsf(x)); - t = h*w; - return t*w; - } + if (ix<=0x42b2d4fc) + return h*2.0F*__ldexp_expf(fabsf(x), -1); /* |x| > overflowthresold, sinh(x) overflow */ return x*shuge; |