Patchwork [libfortran] PR 48488 Fix comments

login
register
mail settings
Submitter Janne Blomqvist
Date April 29, 2011, 4:07 p.m.
Message ID <BANLkTik7UFotrGAGA5Nv=8nJ_0f+OEeKEQ@mail.gmail.com>
Download mbox | patch
Permalink /patch/93453/
State New
Headers show

Comments

Janne Blomqvist - April 29, 2011, 4:07 p.m.
Hi all,

now that we fixed real output, I update the comments per the patch
below and committed.

Patch

Index: io/write.c
===================================================================
--- io/write.c  (revision 173168)
+++ io/write.c  (working copy)
@@ -1456,10 +1456,18 @@  set_fnode_default (st_parameter_dt *dtp,
       break;
     }
 }
-/* Output a real number with default format.
-   This is 1PG14.7E2 for REAL(4), 1PG23.15E3 for REAL(8),
-   1PG28.19E4 for REAL(10) and 1PG43.34E4 for REAL(16).  */
-// FX -- FIXME: should we change the default format for __float128-real(16)?
+
+/* Output a real number with default format.  To guarantee that a
+   binary -> decimal -> binary roundtrip conversion recovers the
+   original value, IEEE 754-2008 requires 9, 17, 21 and 36 significant
+   digits for REAL kinds 4, 8, 10, and 16, respectively. Thus, we use
+   1PG16.9E2 for REAL(4), 1PG25.17E3 for REAL(8), 1PG30.21E4 for
+   REAL(10) and 1PG45.36E4 for REAL(16). The exception is that the
+   Fortran standard requires outputting an extra digit when the scale
+   factor is 1 and when the magnitude of the value is such that E
+   editing is used. However, gfortran compensates for this, and thus
+   for list formatted the same number of significant digits is
+   generated both when using F and E editing.  */

 void
 write_real (st_parameter_dt *dtp, const char *source, int length)
@@ -1472,6 +1480,8 @@  write_real (st_parameter_dt *dtp, const
   dtp->u.p.scale_factor = org_scale;
 }

+/* Similar to list formatted REAL output, for kPG0 where k > 0 we
+   compensate for the extra digit.  */

 void
 write_real_g0 (st_parameter_dt *dtp, const char *source, int length, int d)