From: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
To: "libc-alpha@sourceware.org" <libc-alpha@sourceware.org>
Cc: nd <nd@arm.com>
Subject: [PATCH 6/7] sin/cos slow paths: refactor duplicated code into dosin
Date: Wed, 21 Mar 2018 17:55:00 -0000 [thread overview]
Message-ID: <DB6PR0801MB205388F1D82881B352B28FC583AA0@DB6PR0801MB2053.eurprd08.prod.outlook.com> (raw)
Refactor duplicated code into do_sin. Since all calls to do_sin use copysign to
set the sign of the result, move it inside do_sin. Small inputs use a separate
polynomial, so move this into do_sin as well (the check is based on the more
conservative case when doing large range reduction, but could be relaxed).
ChangeLog:
2018-03-20 Wilco Dijkstra <wdijkstr@arm.com>
* sysdeps/ieee754/dbl-64/s_sin.c (do_sin): Use TAYLOR_SIN for small inputs.
Return correct sign.
(do_sincos): Remove small input check before do_sin, let do_sin set the sign.
(__sin): Likewise.
(__cos): Likewise.
--
diff --git a/sysdeps/ieee754/dbl-64/s_sin.c b/sysdeps/ieee754/dbl-64/s_sin.c
index 7a55636889f186849f638c4c510ee29dd007d655..e4a2153bb8d010d72d898c0d08e9253f4173f51d 100644
--- a/sysdeps/ieee754/dbl-64/s_sin.c
+++ b/sysdeps/ieee754/dbl-64/s_sin.c
@@ -124,6 +124,11 @@ static inline double
__always_inline
do_sin (double x, double dx)
{
+ double xold = x;
+ /* Max ULP is 0.501 if |x| < 0.126, otherwise ULP is 0.518. */
+ if (fabs (x) < 0.126)
+ return TAYLOR_SIN (x * x, x, dx);
+
mynumber u;
if (x <= 0)
@@ -137,7 +142,7 @@ do_sin (double x, double dx)
c = x * dx + xx * (cs2 + xx * (cs4 + xx * cs6));
SINCOS_TABLE_LOOKUP (u, sn, ssn, cs, ccs);
cor = (ssn + s * ccs - sn * c) + cs * s;
- return sn + cor;
+ return __copysign (sn + cor, xold);
}
/* Reduce range of x to within PI/2 with abs (x) < 105414350. The high part
@@ -181,14 +186,8 @@ do_sincos (double a, double da, int4 n)
/* Max ULP is 0.513. */
retval = do_cos (a, da);
else
- {
- double xx = a * a;
- /* Max ULP is 0.501 if xx < 0.01588, otherwise ULP is 0.518. */
- if (xx < 0.01588)
- retval = TAYLOR_SIN (xx, a, da);
- else
- retval = __copysign (do_sin (a, da), a);
- }
+ /* Max ULP is 0.501 if xx < 0.01588, otherwise ULP is 0.518. */
+ retval = do_sin (a, da);
return (n & 2) ? -retval : retval;
}
@@ -207,7 +206,7 @@ SECTION
__sin (double x)
{
#ifndef IN_SINCOS
- double xx, t, a, da;
+ double t, a, da;
mynumber u;
int4 k, m, n;
double retval = 0;
@@ -228,20 +227,11 @@ __sin (double x)
math_check_force_underflow (x);
retval = x;
}
- /*---------------------------- 2^-26 < |x|< 0.25 ----------------------*/
- else if (k < 0x3fd00000)
- {
- xx = x * x;
- /* Taylor series. */
- t = POLYNOMIAL (xx) * (xx * x);
- /* Max ULP of x + t is 0.535. */
- retval = x + t;
- } /* else if (k < 0x3fd00000) */
-/*---------------------------- 0.25<|x|< 0.855469---------------------- */
+/*--------------------------- 2^-26<|x|< 0.855469---------------------- */
else if (k < 0x3feb6000)
{
/* Max ULP is 0.548. */
- retval = __copysign (do_sin (x, 0), x);
+ retval = do_sin (x, 0);
} /* else if (k < 0x3feb6000) */
/*----------------------- 0.855469 <|x|<2.426265 ----------------------*/
@@ -292,7 +282,7 @@ SECTION
#endif
__cos (double x)
{
- double y, xx, a, da;
+ double y, a, da;
mynumber u;
#ifndef IN_SINCOS
int4 k, m, n;
@@ -325,13 +315,9 @@ __cos (double x)
y = hp0 - fabs (x);
a = y + hp1;
da = (y - a) + hp1;
- xx = a * a;
/* Max ULP is 0.501 if xx < 0.01588 or 0.518 otherwise.
Range reduction uses 106 bits here which is sufficient. */
- if (xx < 0.01588)
- retval = TAYLOR_SIN (xx, a, da);
- else
- retval = __copysign (do_sin (a, da), a);
+ retval = do_sin (a, da);
} /* else if (k < 0x400368fd) */
next reply other threads:[~2018-03-21 17:55 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-21 17:55 Wilco Dijkstra [this message]
2018-03-22 22:34 ` Joseph Myers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DB6PR0801MB205388F1D82881B352B28FC583AA0@DB6PR0801MB2053.eurprd08.prod.outlook.com \
--to=wilco.dijkstra@arm.com \
--cc=libc-alpha@sourceware.org \
--cc=nd@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).