[multiple changes]

2005-03-12  Francois-Xavier Coudert  <coudert@clipper.ens.fr>

        PR libfortran/20124
        * gfortran.dg/pr20124.f90: New Test

2005-03-11  Francois-Xavier Coudert  <coudert@clipper.ens.fr>

        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
This commit is contained in:
Francois-Xavier Coudert 2005-03-11 09:03:02 +01:00 committed by Bud Davis
parent cbefb99c99
commit 0b2df4a703
4 changed files with 38 additions and 1 deletions

View file

@ -1,3 +1,8 @@
2005-03-12 Francois-Xavier Coudert <coudert@clipper.ens.fr>
PR libfortran/20124
* gfortran.dg/pr20124.f90: New Test
2005-03-10 James A. Morrison <phython@gcc.gnu.org>
PR tree-optimization/20130

View file

@ -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

View file

@ -1,3 +1,11 @@
2005-03-11 Francois-Xavier Coudert <coudert@clipper.ens.fr>
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 <toon@moene.indiv.nluug.nl>
* runtime/environ.c: Update copyright years.

View file

@ -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;