Message ID | BANLkTim_o8bM6bJyJxYbKW7y=kJe0fZ2ug@mail.gmail.com |
---|---|
State | New |
Headers | show |
> I don't agree with this; with the patch we now output 10 significant > digits, whereas 9 is sufficient for a binary->ascii->binary roundtrip. > So please retain the "reduce d by one when E editing is used" thing > for list format and G0. This is just a side effect of using 1PGw.d > format for list format and G0 in order to avoid duplicating code, but > we don't need to follow this particular craziness that is due to how > the scale factor is specified in the standard. I hadn't noticed this, but I agree with Janne. It should be easy to implement: After the switch between F and E editing, we just need to shift the decimal point and decrement the exponent. No new rounding is required, because we keep the number of significant digits.
On 06/11/2011 12:23 AM, Thomas Henlich wrote: >> I don't agree with this; with the patch we now output 10 significant >> digits, whereas 9 is sufficient for a binary->ascii->binary roundtrip. >> So please retain the "reduce d by one when E editing is used" thing >> for list format and G0. This is just a side effect of using 1PGw.d >> format for list format and G0 in order to avoid duplicating code, but >> we don't need to follow this particular craziness that is due to how >> the scale factor is specified in the standard. > > I hadn't noticed this, but I agree with Janne. > > It should be easy to implement: > > After the switch between F and E editing, we just need to shift the > decimal point and decrement the exponent. No new rounding is required, > because we keep the number of significant digits. > Our default formats for kind=4 are: static void set_fnode_default (st_parameter_dt *dtp, fnode *f, int length) { f->format = FMT_G; switch (length) { case 4: f->u.real.w = 16; f->u.real.d = 9; f->u.real.e = 2; break; This was established as solution to PR48488 where we had two choices for selecting the significant digits. Nine significant digits was established as a requirement to guarantee round trip in all cases. The char4_iunit_1.f03 test case was revised because after we corrected the formatting in PR48906, it started to fail and I observed the test case was looking for the wrong number of significant digits. Based on this, I would suggest we leave it as I have it, which is correct. Jerry
On Sat, Jun 11, 2011 at 14:41, jerry DeLisle <jvdelisle@charter.net> wrote: > This was established as solution to PR48488 where we had two choices for > selecting the significant digits. Nine significant digits was established as > a requirement to guarantee round trip in all cases. The char4_iunit_1.f03 > test case was revised because after we corrected the formatting in PR48906, > it started to fail and I observed the test case was looking for the wrong > number of significant digits. > > Based on this, I would suggest we leave it as I have it, which is correct. I'm afraid it's not. 1.23450002E-06 has nine significant digits. That's how it should be. We don't want 1PG16.9E2 editing for list-directed and G0, but G16.9E2 for the F editing range and 1PE16.8E2 editing for the E range. This is to make sure the result always has nine significant digits, whether in the F or E range.
Index: gcc/testsuite/gfortran.dg/char4_iunit_1.f03 =================================================================== --- gcc/testsuite/gfortran.dg/char4_iunit_1.f03 (revision 174673) +++ gcc/testsuite/gfortran.dg/char4_iunit_1.f03 (working copy) @@ -24,7 +24,7 @@ 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 write(string, *) nan, inf