This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Ping Re: Fix strtod rounding (bug 3479)


On Wed, 5 Sep 2012, Joseph S. Myers wrote:

> On Wed, 5 Sep 2012, Andreas Schwab wrote:
> 
> > That doesn't appear to work with IBM long double:
> 
> See what I said in 
> <http://sourceware.org/ml/libc-alpha/2012-08/msg00603.html> (current 
> version <http://sourceware.org/ml/libc-alpha/2012-09/msg00069.html>, 
> pending review).

Since this is logically a separate issue from the rounding mode
support, I suppose the patches should really be separated, so here is
the patch for the IBM long double issue only, split out from the
rounding mode support patch.  Please test (I haven't tested this patch
version) and review.  (No BZ# number in this patch since it's fixing a
purely testsuite issue that did not exist in any release.)

2012-09-06  Joseph Myers  <joseph@codesourcery.com>

	* stdlib/gen-tst-strtod-round.c: Include <assert.h>.
	(round_str): Handle values above the maximum for IBM long double
	as inexact.
	* stdlib/tst-strtod-round.c (tests): Regenerated.

diff --git a/stdlib/gen-tst-strtod-round.c b/stdlib/gen-tst-strtod-round.c
index f4ad270..56aafab 100644
--- a/stdlib/gen-tst-strtod-round.c
+++ b/stdlib/gen-tst-strtod-round.c
@@ -18,6 +18,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define _GNU_SOURCE
+#include <assert.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -65,7 +66,19 @@ round_str (const char *s, const char *suffix,
   mpfr_init (f);
   int r = string_to_fp (f, s, MPFR_RNDD);
   if (need_exact)
-    mpfr_printf ("\t%s,\n", r ? "false" : "true");
+    {
+      assert (prec == 106 && emin == -1073 && emax == 1024);
+      /* The maximum value in IBM long double has discontiguous
+	 mantissa bits.  */
+      mpfr_t max_value;
+      mpfr_init2 (max_value, 107);
+      mpfr_set_str (max_value, "0x1.fffffffffffff7ffffffffffffcp+1023", 0,
+		    MPFR_RNDN);
+      if (mpfr_cmpabs (f, max_value) > 0)
+	r = 1;
+      mpfr_printf ("\t%s,\n", r ? "false" : "true");
+      mpfr_clear (max_value);
+    }
   print_fp (f, suffix, ",\n");
   string_to_fp (f, s, MPFR_RNDN);
   print_fp (f, suffix, ",\n");
diff --git a/stdlib/tst-strtod-round.c b/stdlib/tst-strtod-round.c
index 1edeff6..c6ad126 100644
--- a/stdlib/tst-strtod-round.c
+++ b/stdlib/tst-strtod-round.c
@@ -1927,7 +1927,7 @@ static const struct test tests[] = {
 	0xf.ffffffffffffcp+1020L,
 	0xf.ffffffffffffcp+1020L,
 	0xf.ffffffffffffcp+1020L,
-	true,
+	false,
 	0xf.ffffffffffffcp+1020L,
 	0xf.ffffffffffffcp+1020L,
 	0xf.ffffffffffffcp+1020L,
@@ -2032,7 +2032,7 @@ static const struct test tests[] = {
 	-0xf.ffffffffffffcp+1020L,
 	-0xf.ffffffffffffcp+1020L,
 	-0xf.ffffffffffffcp+1020L,
-	true,
+	false,
 	-0xf.ffffffffffffcp+1020L,
 	-0xf.ffffffffffffcp+1020L,
 	-0xf.ffffffffffffcp+1020L,

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]