From: Ulrich Drepper Date: Mon, 24 Mar 2008 19:57:55 +0000 (+0000) Subject: [BZ #5857] X-Git-Tag: upstream/2.30~14324 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=af0498dc955f23c4e2eb28b1658ec2e86b4ab069;p=external%2Fglibc.git [BZ #5857] 2008-03-09 Andreas Jaeger [BZ #5857] * sysdeps/ieee754/dbl-64/s_rint.c (__rint): Handle j0==18. * sysdeps/ieee754/dbl-64/s_nearbyint.c (__nearbyint): Likewise. Patch by Mark Elliott . * math/libm-test.inc (nearbyint_test): Add new test cases from #5857. (rint_test): Likewise. --- diff --git a/ChangeLog b/ChangeLog index 6f72ccd..80ee942 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-03-09 Andreas Jaeger + + [BZ #5857] + * sysdeps/ieee754/dbl-64/s_rint.c (__rint): Handle j0==18. + * sysdeps/ieee754/dbl-64/s_nearbyint.c (__nearbyint): Likewise. + Patch by Mark Elliott . + + * math/libm-test.inc (nearbyint_test): Add new test cases from #5857. + (rint_test): Likewise. + 2008-03-24 Ulrich Drepper * nis/nis_call.c (nis_server_cache_search): Save errno around stat diff --git a/math/libm-test.inc b/math/libm-test.inc index e698923..a33a182 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -4481,6 +4481,11 @@ nearbyint_test (void) TEST_f_f (nearbyint, -0.5, minus_zero); TEST_f_f (nearbyint, -1.5, -2.0); + TEST_f_f (nearbyint, 262144.75, 262145.0); + TEST_f_f (nearbyint, 262142.75, 262143.0); + TEST_f_f (nearbyint, 524286.75, 524287.0); + TEST_f_f (nearbyint, 524288.75, 524289.0); + END (nearbyint); } @@ -4852,6 +4857,10 @@ rint_test (void) TEST_f_f (rint, -0.1, -0.0); TEST_f_f (rint, -0.25, -0.0); TEST_f_f (rint, -0.625, -1.0); + TEST_f_f (rint, 262144.75, 262145.0); + TEST_f_f (rint, 262142.75, 262143.0); + TEST_f_f (rint, 524286.75, 524287.0); + TEST_f_f (rint, 524288.75, 524289.0); #ifdef TEST_LDOUBLE /* The result can only be represented in long double. */ TEST_f_f (rint, 4503599627370495.5L, 4503599627370496.0L); diff --git a/sysdeps/ieee754/dbl-64/s_nearbyint.c b/sysdeps/ieee754/dbl-64/s_nearbyint.c index 32f5bf9..71e14cf 100644 --- a/sysdeps/ieee754/dbl-64/s_nearbyint.c +++ b/sysdeps/ieee754/dbl-64/s_nearbyint.c @@ -71,8 +71,15 @@ TWO52[2]={ if(((i0&i)|i1)==0) return x; /* x is integral */ i>>=1; if(((i0&i)|i1)!=0) { - if(j0==19) i1 = 0x40000000; else + if (j0==19) + i1 = 0x40000000; + else if (j0<18) i0 = (i0&(~i))|((0x20000)>>j0); + else + { + i0 &= ~i; + i1 = 0x80000000; + } } } } else if (j0>51) { diff --git a/sysdeps/ieee754/dbl-64/s_rint.c b/sysdeps/ieee754/dbl-64/s_rint.c index e5f2412..4e6381e 100644 --- a/sysdeps/ieee754/dbl-64/s_rint.c +++ b/sysdeps/ieee754/dbl-64/s_rint.c @@ -67,8 +67,15 @@ TWO52[2]={ if(((i0&i)|i1)==0) return x; /* x is integral */ i>>=1; if(((i0&i)|i1)!=0) { - if(j0==19) i1 = 0x40000000; else - i0 = (i0&(~i))|((0x20000)>>j0); + if (j0==19) + i1 = 0x40000000; + else if (j0<18) + i0 = (i0&(~i))|((0x20000)>>j0); + else + { + i0 &= ~i; + i1 = 0x80000000; + } } } } else if (j0>51) {