re PR libfortran/48787 (Invalid UP/DOWN rounding with F editing)
2011-05-04 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libgfortran/48787 * io/write_float.def (output_float): Adjust up and down rounding for cases where 'd' = 0. Gather common code to one location. From-SVN: r173408
This commit is contained in:
parent
c5c04a8fd8
commit
d6b872ad5e
2 changed files with 24 additions and 12 deletions
|
@ -1,3 +1,9 @@
|
|||
2011-05-04 Jerry DeLisle <jvdelisle@gcc.gnu.org>
|
||||
|
||||
PR libgfortran/48787
|
||||
* io/write_float.def (output_float): Adjust up and down rounding for
|
||||
cases where 'd' = 0. Gather common code to one location.
|
||||
|
||||
2011-05-01 Jerry DeLisle <jvdelisle@gcc.gnu.org>
|
||||
|
||||
PR libgfortran/48787
|
||||
|
|
|
@ -221,6 +221,7 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
|
|||
|
||||
if (zero_flag)
|
||||
goto skip;
|
||||
|
||||
/* Round the value. The value being rounded is an unsigned magnitude.
|
||||
The ROUND_COMPATIBLE is rounding away from zero when there is a tie. */
|
||||
switch (dtp->u.p.current_unit->round_status)
|
||||
|
@ -230,19 +231,11 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
|
|||
case ROUND_UP:
|
||||
if (sign_bit)
|
||||
goto skip;
|
||||
rchar = '0';
|
||||
/* Scan for trailing zeros to see if we really need to round it. */
|
||||
for(i = nbefore + nafter; i < ndigits; i++)
|
||||
{
|
||||
if (digits[i] != '0')
|
||||
goto do_rnd;
|
||||
}
|
||||
goto skip;
|
||||
goto updown;
|
||||
case ROUND_DOWN:
|
||||
if (!sign_bit)
|
||||
goto skip;
|
||||
rchar = '0';
|
||||
break;
|
||||
goto updown;
|
||||
case ROUND_NEAREST:
|
||||
/* Round compatible unless there is a tie. A tie is a 5 with
|
||||
all trailing zero's. */
|
||||
|
@ -254,7 +247,7 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
|
|||
if (digits[i] != '0')
|
||||
goto do_rnd;
|
||||
}
|
||||
/* It is a tie so round to even. */
|
||||
/* It is a tie so round to even. */
|
||||
switch (digits[nafter + nbefore - 1])
|
||||
{
|
||||
case '1':
|
||||
|
@ -274,8 +267,21 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
|
|||
case ROUND_UNSPECIFIED:
|
||||
case ROUND_COMPATIBLE:
|
||||
rchar = '5';
|
||||
/* Just fall through and do the actual rounding. */
|
||||
goto do_rnd;
|
||||
}
|
||||
|
||||
updown:
|
||||
|
||||
rchar = '0';
|
||||
if (w > 0 && d == 0 && p == 0)
|
||||
nbefore = 1;
|
||||
/* Scan for trailing zeros to see if we really need to round it. */
|
||||
for(i = nbefore + nafter; i < ndigits; i++)
|
||||
{
|
||||
if (digits[i] != '0')
|
||||
goto do_rnd;
|
||||
}
|
||||
goto skip;
|
||||
|
||||
do_rnd:
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue