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:
parent
62c8d7223e
commit
0eac6ca562
@ -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
|
||||||
|
@ -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. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user