aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Pluzhnikov <ppluzhnikov@google.com>2011-09-08 23:37:32 -0400
committerUlrich Drepper <drepper@gmail.com>2011-09-08 23:37:32 -0400
commit7f5517aa5269af6cac791ca74111f817320b73f2 (patch)
tree0fd1727af3deb3b0205a8ba2371889a610fee6ed
parent5f69cd2f94fc7bf0a468bf0a5b53b32f2b7c468c (diff)
downloadglibc-7f5517aa5269af6cac791ca74111f817320b73f2.tar
glibc-7f5517aa5269af6cac791ca74111f817320b73f2.tar.gz
glibc-7f5517aa5269af6cac791ca74111f817320b73f2.tar.bz2
glibc-7f5517aa5269af6cac791ca74111f817320b73f2.zip
Fix lround() loses precision
-rw-r--r--ChangeLog6
-rw-r--r--math/libm-test.inc1
-rw-r--r--sysdeps/ieee754/dbl-64/s_lround.c2
3 files changed, 8 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 6b12f3b76b..34e9e37109 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2011-08-18 Paul Pluzhnikov <ppluzhnikov@google.com>
+ Ian Lance Taylor <iant@google.com>
+
+ * math/libm-test.inc (lround_test): New testcase.
+ * sysdeps/ieee754/dbl-64/s_lround.c (__lround): Don't lose precision.
+
2011-09-08 Ulrich Drepper <drepper@gmail.com>
* Makefile: Remove support for automatic cvs check-ins.
diff --git a/math/libm-test.inc b/math/libm-test.inc
index c6ed7a39fe..301d4a8f66 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -4386,6 +4386,7 @@ lround_test (void)
TEST_f_l (lround, 1073741824.01, 1073741824);
# if LONG_MAX > 281474976710656
TEST_f_l (lround, 281474976710656.025, 281474976710656);
+ TEST_f_l (llround, -3.65309740835E17, -365309740835000000);
# endif
TEST_f_l (lround, 2097152.5, 2097153);
TEST_f_l (lround, -2097152.5, -2097153);
diff --git a/sysdeps/ieee754/dbl-64/s_lround.c b/sysdeps/ieee754/dbl-64/s_lround.c
index 4e1302ad4d..a849997a15 100644
--- a/sysdeps/ieee754/dbl-64/s_lround.c
+++ b/sysdeps/ieee754/dbl-64/s_lround.c
@@ -51,7 +51,7 @@ __lround (double x)
else if (j0 < (int32_t) (8 * sizeof (long int)) - 1)
{
if (j0 >= 52)
- result = ((long int) i0 << (j0 - 20)) | (i1 << (j0 - 52));
+ result = ((long int) i0 << (j0 - 20)) | ((long int) i1 << (j0 - 52));
else
{
u_int32_t j = i1 + (0x80000000 >> (j0 - 20));