This is the mail archive of the
mailing list for the GNU Fortran project.
Re: [patch, libgfortran] PR48906 Wrong rounding results with -m32
- From: Janne Blomqvist <blomqvist dot janne at gmail dot com>
- To: jerry DeLisle <jvdelisle at charter dot net>
- Cc: gfortran <fortran at gcc dot gnu dot org>, gcc patches <gcc-patches at gcc dot gnu dot org>, Thomas Henlich <thenlich at users dot sourceforge dot net>
- Date: Sat, 11 Jun 2011 09:28:21 +0300
- Subject: Re: [patch, libgfortran] PR48906 Wrong rounding results with -m32
- References: <4DE8D8D6.email@example.com> <4DF25409.firstname.lastname@example.org>
On Fri, Jun 10, 2011 at 20:27, jerry DeLisle <email@example.com> wrote:
> On 06/03/2011 05:51 AM, jerry DeLisle wrote:
>> 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
>> 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 ;) )
--- 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.