From patchwork Tue Sep 27 17:49:13 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siddhesh Poyarekar X-Patchwork-Id: 16083 Received: (qmail 113947 invoked by alias); 27 Sep 2016 17:49:44 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 113882 invoked by uid 89); 27 Sep 2016 17:49:43 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.1 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, SPF_NEUTRAL autolearn=no version=3.3.2 spammy=conclude, sine X-HELO: homiemail-a51.g.dreamhost.com From: Siddhesh Poyarekar To: libc-alpha@sourceware.org Subject: [PATCH 4/4] Use copysign instead of ternary for some sin/cos input ranges Date: Tue, 27 Sep 2016 23:19:13 +0530 Message-Id: <1474998553-2366-5-git-send-email-siddhesh@sourceware.org> In-Reply-To: <1474998553-2366-1-git-send-email-siddhesh@sourceware.org> References: <1474998553-2366-1-git-send-email-siddhesh@sourceware.org> These are remaining cases where we can deduce and conclude that the sign of the result should be the same as the sign of the input being checked. For example, for sin(x), the sign of the result is the same as the result itself for x < pi. Likewise, for sine values where x after range reduction falls into this range and its sign is preserved. * sysdeps/ieee754/dbl-64/s_sin.c (do_sincos_1): Use copysign instead of ternary condition. (do_sincos_2): Likewise. (__sin): Likewise. (__cos): Likewise. (slow): Likewise. (sloww): Likewise. (sloww1): Likewise. (bsloww): Likewise. (bsloww1): Likewise. --- sysdeps/ieee754/dbl-64/s_sin.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/sysdeps/ieee754/dbl-64/s_sin.c b/sysdeps/ieee754/dbl-64/s_sin.c index e4333a4..40d538d 100644 --- a/sysdeps/ieee754/dbl-64/s_sin.c +++ b/sysdeps/ieee754/dbl-64/s_sin.c @@ -344,7 +344,7 @@ do_sincos_1 (double a, double da, double x, int4 n, int4 k) { res = do_sin (a, da, &cor); cor = 1.035 * cor + __copysign (eps, cor); - retval = ((res == res + cor) ? ((a > 0) ? res : -res) + retval = ((res == res + cor) ? __copysign (res, a) : sloww1 (a, da, x, k)); } break; @@ -418,7 +418,7 @@ do_sincos_2 (double a, double da, double x, int4 n, int4 k) { res = do_sin (a, da, &cor); cor = 1.035 * cor + __copysign (eps, cor); - retval = ((res == res + cor) ? ((a > 0) ? res : -res) + retval = ((res == res + cor) ? __copysign (res, a) : bsloww1 (a, da, x, n)); } break; @@ -479,7 +479,7 @@ __sin (double x) { res = do_sin (x, 0, &cor); retval = (res == res + 1.096 * cor) ? res : slow1 (x); - retval = m > 0 ? retval : -retval; + retval = __copysign (retval, x); } /* else if (k < 0x3feb6000) */ /*----------------------- 0.855469 <|x|<2.426265 ----------------------*/ @@ -489,7 +489,7 @@ __sin (double x) t = hp0 - fabs (x); res = do_cos (t, hp1, &cor); retval = (res == res + 1.020 * cor) ? res : slow2 (x); - retval = m > 0 ? retval : -retval; + retval = __copysign (retval, x); } /* else if (k < 0x400368fd) */ #ifndef IN_SINCOS @@ -580,7 +580,7 @@ __cos (double x) { res = do_sin (a, da, &cor); cor = 1.035 * cor + __copysign (1.0e-31, cor); - retval = ((res == res + cor) ? ((a > 0) ? res : -res) + retval = ((res == res + cor) ? __copysign (res, a) : sloww1 (a, da, x, 1)); } @@ -634,9 +634,9 @@ slow (double x) __dubsin (fabs (x), 0, w); if (w[0] == w[0] + 1.000000001 * w[1]) - return (x > 0) ? w[0] : -w[0]; + return __copysign (w[0], x); - return (x > 0) ? __mpsin (x, 0, false) : -__mpsin (-x, 0, false); + return __copysign (__mpsin (fabs (x), 0, false), x); } /*******************************************************************************/ @@ -717,7 +717,7 @@ sloww (double x, double dx, double orig, int k) cor = 1.000000001 * w[1] + __copysign (eps, w[1]); if (w[0] == w[0] + cor) - return (x > 0) ? w[0] : -w[0]; + return __copysign (w[0], x); t = (orig * hpinv + toint); xn = t - toint; @@ -743,7 +743,7 @@ sloww (double x, double dx, double orig, int k) cor = 1.000000001 * w[1] + __copysign (eps, w[1]); if (w[0] == w[0] + cor) - return (a > 0) ? w[0] : -w[0]; + return __copysign (w[0], a); return k ? __mpcos (orig, 0, true) : __mpsin (orig, 0, true); } @@ -764,7 +764,7 @@ sloww1 (double x, double dx, double orig, int k) res = do_sin_slow (x, dx, 3.1e-30 * fabs (orig), &cor); if (res == res + cor) - return (x > 0) ? res : -res; + return __copysign (res, x); dx = (x > 0 ? dx : -dx); __dubsin (fabs (x), dx, w); @@ -773,7 +773,7 @@ sloww1 (double x, double dx, double orig, int k) cor = 1.000000005 * w[1] + __copysign (eps, w[1]); if (w[0] == w[0] + cor) - return (x > 0) ? w[0] : -w[0]; + return __copysign (w[0], x); return (k == 1) ? __mpcos (orig, 0, true) : __mpsin (orig, 0, true); } @@ -833,7 +833,7 @@ bsloww (double x, double dx, double orig, int n) cor = 1.000000001 * w[1] + __copysign (1.1e-24, w[1]); if (w[0] == w[0] + cor) - return (x > 0) ? w[0] : -w[0]; + return __copysign (w[0], x); return (n & 1) ? __mpcos (orig, 0, true) : __mpsin (orig, 0, true); } @@ -861,7 +861,7 @@ bsloww1 (double x, double dx, double orig, int n) cor = 1.000000005 * w[1] + __copysign (1.1e-24, w[1]); if (w[0] == w[0] + cor) - return (x > 0) ? w[0] : -w[0]; + return __copysign (w[0], x); return (n & 1) ? __mpcos (orig, 0, true) : __mpsin (orig, 0, true); }