Ping Re: Fix strtod rounding (bug 3479)
Joseph S. Myers
joseph@codesourcery.com
Thu Sep 6 10:55:00 GMT 2012
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
More information about the Libc-alpha
mailing list