On 04/25/2011 07:36 AM, Janne Blomqvist wrote:
On Mon, Apr 25, 2011 at 14:44, Jerry DeLisle<jvdeli...@frontier.com>  wrote:
On 04/25/2011 03:48 AM, Janne Blomqvist wrote:
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.

Yes, that comment in the PR is correct; to guarantee that a
binary->ascii->binary roundtrip preserves the original binary value
(with the default "round to nearest, break on even" rounding mode),
one must output at least {9, 17, 21, 36} significant digits for real
kinds 4, 8, 10, and 16, respectively (yes, I double-checked IEEE
754-2008 that this is indeed correct).

Since for the G edit descriptor d is equivalent to the number of
significant digits, AFAICS the write.c patch below is correct and the
bug must be elsewhere, no?


No.

Look at this example:

program t4
  implicit none
  character(len=44) :: string
  write(*,*) 1.2345e-06, 4.2846e+10_8
  write(*,'(1x,1pG16.9e2,1x,1pG25.17e3)') 1.2345e-06, 4.2846e+10_8
  write(*,'(1x,1pG15.8e2,1x,1pG25.17e3)') 1.2345e-06, 4.2846e+10_8
end program t4

This gives with the patch:

  1.234500019E-06   42846000000.000000
  1.234500019E-06   42846000000.000000
  1.23450002E-06   42846000000.000000

And without the patch:

  1.23450002E-06   42846000000.000000
  1.234500019E-06   42846000000.000000
  1.23450002E-06   42846000000.000000

d is the number of digits after the decimal point, not the number of significant digits.

For comaprison, ifort gives:

  1.2345000E-06   42846000000.0000
  1.234500019E-06   42846000000.000000
  1.23450002E-06   42846000000.000000

Ifort chooses to use d=7 for list directed.

With that being said, I do think there is possibly a different bug not related to the above that I am working on isolating it. Stay tuned.

Jerry

Reply via email to