about summary refs log tree commit diff
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.gz
glibc-7f5517aa5269af6cac791ca74111f817320b73f2.tar.xz
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));