aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/ieee754/dbl-64/s_sin.c
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@sourceware.org>2016-07-18 22:33:09 +0530
committerSiddhesh Poyarekar <siddhesh@sourceware.org>2016-07-18 22:33:09 +0530
commitcbf88869edced4b23d792d95a8626e35b831df35 (patch)
treeb1ed5b36db2734e3dc0d4bcb4b6051630f7cbd0d /sysdeps/ieee754/dbl-64/s_sin.c
parent2413e73c32fc36470885ae548631e081d66f4201 (diff)
downloadglibc-cbf88869edced4b23d792d95a8626e35b831df35.zip
glibc-cbf88869edced4b23d792d95a8626e35b831df35.tar.gz
glibc-cbf88869edced4b23d792d95a8626e35b831df35.tar.bz2
Fix cos computation for multiple precision fallback (bz #20357)
During the sincos consolidation I made two mistakes, one was a logical error due to which cos(0x1.8475e5afd4481p+0) returned sin(0x1.8475e5afd4481p+0) instead. The second issue was an error in negating inputs for the correct quadrants for sine. I could not find a suitable test case for this despite running a program to search for such an input for a couple of hours. Following patch fixes both issues. Tested on x86_64. Thanks to Matt Clay for identifying the issue. [BZ #20357] * sysdeps/ieee754/dbl-64/s_sin.c (sloww): Fix up condition to call __mpsin/__mpcos and to negate values. * math/auto-libm-test-in: Add test. * math/auto-libm-test-out: Regenerate.
Diffstat (limited to 'sysdeps/ieee754/dbl-64/s_sin.c')
-rw-r--r--sysdeps/ieee754/dbl-64/s_sin.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/sysdeps/ieee754/dbl-64/s_sin.c b/sysdeps/ieee754/dbl-64/s_sin.c
index ca2532f..7c9a079 100644
--- a/sysdeps/ieee754/dbl-64/s_sin.c
+++ b/sysdeps/ieee754/dbl-64/s_sin.c
@@ -803,7 +803,7 @@ sloww (double x, double dx, double orig, int k)
a = t - y;
da = ((t - a) - y) + da;
- if (n == 2 || n == 1)
+ if (n & 2)
{
a = -a;
da = -da;
@@ -817,7 +817,7 @@ sloww (double x, double dx, double orig, int k)
if (w[0] == w[0] + cor)
return (a > 0) ? w[0] : -w[0];
- return (n & 1) ? __mpcos (orig, 0, true) : __mpsin (orig, 0, true);
+ return k ? __mpcos (orig, 0, true) : __mpsin (orig, 0, true);
}
/***************************************************************************/