mirror of git://sourceware.org/git/glibc.git
Use copysign instead of ternary for some sin/cos input ranges
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.
This commit is contained in:
parent
3459931a1a
commit
2bf499708d
11
ChangeLog
11
ChangeLog
|
@ -1,5 +1,16 @@
|
|||
2016-09-29 Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||
|
||||
* 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 (do_cos_slow): use copysign
|
||||
instead of ternary condition.
|
||||
(do_sin_slow): Likewise.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue