summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--math/libm-test.inc9
-rw-r--r--sysdeps/ieee754/dbl-64/s_nearbyint.c9
-rw-r--r--sysdeps/ieee754/dbl-64/s_rint.c11
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) {