This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH 4/4] Use copysign instead of ternary for some sin/cos input ranges
On 09/27/2016 01:49 PM, Siddhesh Poyarekar wrote:
> 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.
LGTM.
> ---
> 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)
OK.
> : 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)
OK.
> : 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);
OK.
> } /* 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);
OK.
> } /* 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)
OK.
> : 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);
OK.
>
> - return (x > 0) ? __mpsin (x, 0, false) : -__mpsin (-x, 0, false);
> + return __copysign (__mpsin (fabs (x), 0, false), x);
OK.
> }
>
> /*******************************************************************************/
> @@ -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);
OK.
>
> 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);
OK.
>
> 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);
OK.
>
> 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);
OK.
>
> 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);
OK.
>
> 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);
OK.
>
> return (n & 1) ? __mpcos (orig, 0, true) : __mpsin (orig, 0, true);
> }
>
--
Cheers,
Carlos.