Date: Fri, 21 Oct 2011 06:28:47 +0000 (UTC) From: David Schultz <das@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r226598 - head/lib/msun/src Message-ID: <201110210628.p9L6SlID009848@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: das Date: Fri Oct 21 06:28:47 2011 New Revision: 226598 URL: http://svn.freebsd.org/changeset/base/226598 Log: Use __ldexp_exp() to simplify things and improve accuracy for x near the overflow threshold. Modified: head/lib/msun/src/e_cosh.c head/lib/msun/src/e_coshf.c head/lib/msun/src/e_sinh.c head/lib/msun/src/e_sinhf.c Modified: head/lib/msun/src/e_cosh.c ============================================================================== --- head/lib/msun/src/e_cosh.c Fri Oct 21 06:27:56 2011 (r226597) +++ head/lib/msun/src/e_cosh.c Fri Oct 21 06:28:47 2011 (r226598) @@ -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; Modified: head/lib/msun/src/e_coshf.c ============================================================================== --- head/lib/msun/src/e_coshf.c Fri Oct 21 06:27:56 2011 (r226597) +++ head/lib/msun/src/e_coshf.c Fri Oct 21 06:28:47 2011 (r226598) @@ -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; Modified: head/lib/msun/src/e_sinh.c ============================================================================== --- head/lib/msun/src/e_sinh.c Fri Oct 21 06:27:56 2011 (r226597) +++ head/lib/msun/src/e_sinh.c Fri Oct 21 06:28:47 2011 (r226598) @@ -40,9 +40,8 @@ static const double one = 1.0, shuge = 1 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; Modified: head/lib/msun/src/e_sinhf.c ============================================================================== --- head/lib/msun/src/e_sinhf.c Fri Oct 21 06:27:56 2011 (r226597) +++ head/lib/msun/src/e_sinhf.c Fri Oct 21 06:28:47 2011 (r226598) @@ -24,7 +24,7 @@ static const float one = 1.0, shuge = 1. 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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201110210628.p9L6SlID009848>