This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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: [patch, libgfortran] Fix numerous formatting bugs


On 04/25/2011 03:48 AM, Janne Blomqvist wrote:
On Sun, Apr 24, 2011 at 23:32, Jerry DeLisle<jvdelisle@frontier.com> wrote:
The final solution to 48602 I want to do as a second phase to this. The
second phase will attempt to avoid floating point comparisons which are
sensitive to optimizations and or printf behavior.

Sounds like a good idea. I think it should be possible to modify the algorithm to just count decimal places with integer arithmetic.

Regression tested on x86-64. I do have some concern that the test cases
modified may have issues on other platforms because we have increased the
default precision on some reals.  If this happens we should be able to
adjust test cases by not using default formatting.

Or xfail the testcases in question on those targets; I think it makes sense to assume IEEE 754 hardware and a snprintf() capable of correct rounding as the baseline.

Now, for one of the testcase changes:

--- gcc/testsuite/gfortran.dg/char4_iunit_1.f03	(revision 172909)
+++ gcc/testsuite/gfortran.dg/char4_iunit_1.f03	(working copy)
@@ -24,11 +24,11 @@ program char4_iunit_1
    write(string, *) .true., .false. , .true.
    if (string .ne. 4_" T F T                                    ") call abort
    write(string, *) 1.2345e-06, 4.2846e+10_8
-  if (string .ne. 4_"  1.23450002E-06   42846000000.000000     ") call abort
+  if (string .ne. 4_"  1.234500019E-06   42846000000.000000    ") call abort

This looks wrong. For correctly rounded REAL(4) output, we need 9
significant digits, but here we print 10.


Well, I bumped it up for defaults based on pr48488 comment #2 shown below. Have I misinterpreted? Maybe what we want is w=16, d=8?


Jerry

Index: libgfortran/io/write.c
===================================================================
--- libgfortran/io/write.c	(revision 172909)
+++ libgfortran/io/write.c	(working copy)
@@ -1432,8 +1432,8 @@ set_fnode_default (st_parameter_dt *dtp, fnode *f,
   switch (length)
     {
     case 4:
-      f->u.real.w = 15;
-      f->u.real.d = 8;
+      f->u.real.w = 16;
+      f->u.real.d = 9;
       f->u.real.e = 2;
       break;
     case 8:
@@ -1442,13 +1442,13 @@ set_fnode_default (st_parameter_dt *dtp, fnode *f,
       f->u.real.e = 3;
       break;
     case 10:
-      f->u.real.w = 29;
-      f->u.real.d = 20;
+      f->u.real.w = 30;
+      f->u.real.d = 21;
       f->u.real.e = 4;
       break;
     case 16:
-      f->u.real.w = 44;
-      f->u.real.d = 35;
+      f->u.real.w = 45;
+      f->u.real.d = 36;
       f->u.real.e = 4;
       break;
     default:


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