[patch, libgfortran] PR48906 Wrong rounding results with -m32

Janne Blomqvist blomqvist.janne@gmail.com
Sat Jun 11 08:24:00 GMT 2011


On Fri, Jun 10, 2011 at 20:27, jerry DeLisle <jvdelisle@charter.net> wrote:
> On 06/03/2011 05:51 AM, jerry DeLisle wrote:
>>
>> Hi,
>>
>> The attached patch, which includes test cases, fixes this bug by
>> eliminating the
>> code which used floating point instructions to determine the 'r' value as
>> outlined in the Fortran standard under G formatting.
>>
>> Essentially, the code now examines the d and e values to determine the
>> number of
>> digits before and after the decimal point and whether or not to display
>> the 'E'
>> exponent symbol. Adjustments are made for various corner cases, including
>> when
>> rounding has resulted in a carry. (see PR for details of the trials)
>>
>> This patch is intrusive. It results in a minor performance improvement. It
>> eliminates a bit of code.
>>
>> Regression tested on x86-64.
>>
>> OK for trunk? then later back port to 4.6 after some proving time?
>
> Attached is updated patch based on comments from Thomas Henlich.  See my
> comment #33 and subsequent comments in the PR48906 explaining the issue with
> test case fmt_g0_6.f08 which is revised by the updated patch.
>
> Regression tested on X86-64.
>
> OK for trunk. (please ;) )

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


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.

Otherwise it looks nice. Good job!

FWIW, as this is quite tricky code and not a regression, IMHO we
should not backport it.

-- 
Janne Blomqvist



More information about the Gcc-patches mailing list