From 7f5517aa5269af6cac791ca74111f817320b73f2 Mon Sep 17 00:00:00 2001 From: Paul Pluzhnikov Date: Thu, 8 Sep 2011 23:37:32 -0400 Subject: [PATCH] Fix lround() loses precision --- ChangeLog | 6 ++++++ math/libm-test.inc | 1 + sysdeps/ieee754/dbl-64/s_lround.c | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 6b12f3b76b..34e9e37109 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-08-18 Paul Pluzhnikov + Ian Lance Taylor + + * 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 * 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));