re PR libfortran/47567 (Wrong output for small absolute values with F editing)

2011-02-28  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR libgfortran/47567
	* io/write_float.def (output_float): Move handling of w = 0 to after
	output rounding. Check for zero and set zero_flag accordingly. Set
	width according to zero_flag. Add better comments.

From-SVN: r170585
This commit is contained in:
Jerry DeLisle 2011-03-01 02:24:50 +00:00
parent 62c8d7223e
commit 0eac6ca562
2 changed files with 25 additions and 14 deletions

View File

@ -1,3 +1,10 @@
2011-02-28 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/47567
* io/write_float.def (output_float): Move handling of w = 0 to after
output rounding. Check for zero and set zero_flag accordingly. Set
width according to zero_flag. Add better comments.
2011-02-27 Jerry DeLisle <jvdelisle@gcc.gnu.org> 2011-02-27 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/47778 PR libgfortran/47778

View File

@ -109,15 +109,7 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
/* Make sure zero comes out as 0.0e0. */ /* Make sure zero comes out as 0.0e0. */
if (zero_flag) if (zero_flag)
{ e = 0;
e = 0;
if (compile_options.sign_zero != 1)
sign = calculate_sign (dtp, 0);
/* Handle special cases. */
if (w == 0)
w = d + (sign != S_NONE ? 2 : 1) + (d == 0 ? 1 : 0);
}
/* Normalize the fractional component. */ /* Normalize the fractional component. */
buffer[2] = buffer[1]; buffer[2] = buffer[1];
@ -376,15 +368,21 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
else else
edigits = 0; edigits = 0;
/* Zero values always output as positive, even if the value was negative /* Scan the digits string and count the number of zeros. If we make it
before rounding. */ all the way through the loop, we know the value is zero after the
rounding completed above. */
for (i = 0; i < ndigits; i++) for (i = 0; i < ndigits; i++)
{ {
if (digits[i] != '0') if (digits[i] != '0')
break; break;
} }
/* To format properly, we need to know if the rounded result is zero and if
so, we set the zero_flag which may have been already set for
actual zero. */
if (i == ndigits) if (i == ndigits)
{ {
zero_flag = true;
/* The output is zero, so set the sign according to the sign bit unless /* The output is zero, so set the sign according to the sign bit unless
-fno-sign-zero was specified. */ -fno-sign-zero was specified. */
if (compile_options.sign_zero == 1) if (compile_options.sign_zero == 1)
@ -393,11 +391,17 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
sign = calculate_sign (dtp, 0); sign = calculate_sign (dtp, 0);
} }
/* Pick a field size if none was specified. */ /* Pick a field size if none was specified, taking into account small
values that may have been rounded to zero. */
if (w <= 0) if (w <= 0)
{ {
w = nbefore + nzero + nafter + (sign != S_NONE ? 2 : 1); if (zero_flag)
w = w == 1 ? 2 : w; w = d + (sign != S_NONE ? 2 : 1) + (d == 0 ? 1 : 0);
else
{
w = nbefore + nzero + nafter + (sign != S_NONE ? 2 : 1);
w = w == 1 ? 2 : w;
}
} }
/* Work out how much padding is needed. */ /* Work out how much padding is needed. */