diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | math/libm-test.inc | 9 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/s_nearbyint.c | 9 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/s_rint.c | 11 |
4 files changed, 36 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog index 6f72ccd38d..80ee942ef7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-03-09 Andreas Jaeger <aj@suse.de> + + [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 <mark.h.elliott@lmco.com>. + + * math/libm-test.inc (nearbyint_test): Add new test cases from #5857. + (rint_test): Likewise. + 2008-03-24 Ulrich Drepper <drepper@redhat.com> * 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 e698923f4e..a33a182857 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 32f5bf9447..71e14cfb6d 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 e5f241291c..4e6381efbe 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) { |