From 0b2df4a7037bf50942bb43ae799f88a7d6c4c261 Mon Sep 17 00:00:00 2001 From: Francois-Xavier Coudert Date: Fri, 11 Mar 2005 09:03:02 +0100 Subject: [PATCH] [multiple changes] 2005-03-12 Francois-Xavier Coudert PR libfortran/20124 * gfortran.dg/pr20124.f90: New Test 2005-03-11 Francois-Xavier Coudert PR libfortran/20124 * write.c (output_float): Adds a nzero_real variable to store the number of leading zeros whatever the format width is. Corrects the rounding of numbers less than 10^(-width). Fixes typo in an error message. Updates copyright years From-SVN: r96291 --- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/pr20124.f90 | 8 ++++++++ libgfortran/ChangeLog | 8 ++++++++ libgfortran/io/write.c | 18 +++++++++++++++++- 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/pr20124.f90 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c51d1d11106..109c8482ca8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-03-12 Francois-Xavier Coudert + + PR libfortran/20124 + * gfortran.dg/pr20124.f90: New Test + 2005-03-10 James A. Morrison PR tree-optimization/20130 diff --git a/gcc/testsuite/gfortran.dg/pr20124.f90 b/gcc/testsuite/gfortran.dg/pr20124.f90 new file mode 100644 index 00000000000..69f4f18b29c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr20124.f90 @@ -0,0 +1,8 @@ +! { dg-do run } +! pr 20124 + character*80 line + x = -.01 + y = .01 + write(line,'(2f10.2)') x, y + if (line.ne.' -0.01 0.01') call abort + end diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 2e3bd391b40..ac7e067e5c9 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,11 @@ +2005-03-11 Francois-Xavier Coudert + + PR libfortran/20124 + * write.c (output_float): Adds a nzero_real variable to store + the number of leading zeros whatever the format width is. Corrects + the rounding of numbers less than 10^(-width). Fixes typo in an + error message. Updates copyright years + 2005-02-27 Toon Moene * runtime/environ.c: Update copyright years. diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c index 1babd20463f..9c255d7d69e 100644 --- a/libgfortran/io/write.c +++ b/libgfortran/io/write.c @@ -286,6 +286,8 @@ output_float (fnode *f, double value, int len) int nzero; /* Number of digits after the decimal point. */ int nafter; + /* Number of zeros after the decimal point, whatever the precision. */ + int nzero_real; int leadzero; int nblanks; int i; @@ -295,6 +297,9 @@ output_float (fnode *f, double value, int len) w = f->u.real.w; d = f->u.real.d; + nzero_real = -1; + + /* We should always know the field width and precision. */ if (d < 0) internal_error ("Unspecified precision"); @@ -359,6 +364,7 @@ output_float (fnode *f, double value, int len) if (nbefore < 0) { nzero = -nbefore; + nzero_real = nzero; if (nzero > d) nzero = d; nafter = d - nzero; @@ -436,7 +442,17 @@ output_float (fnode *f, double value, int len) /* Round the value. */ if (nbefore + nafter == 0) - ndigits = 0; + { + ndigits = 0; + if (nzero_real == d && digits[0] >= '5') + { + /* We rounded to zero but shouldn't have */ + nzero--; + nafter = 1; + digits[0] = '1'; + ndigits = 1; + } + } else if (nbefore + nafter < ndigits) { ndigits = nbefore + nafter; -- 2.30.2