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

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

	PR libgfortran/47567
	* io/write_float.def (output_float): Eliminate some redundant code.
	Adjust width for case of F0.X for values of zero and all other values.
	Expand cases where '*' is set to give cleaner results.

From-SVN: r169853
This commit is contained in:
Jerry DeLisle 2011-02-05 17:58:48 +00:00
parent 02b177518d
commit 9e7628863b
2 changed files with 14 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2011-02-05 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/47567
* io/write_float.def (output_float): Eliminate some redundant code.
Adjust width for case of F0.X for values of zero and all other values.
Expand cases where '*' is set to give cleaner results.
2011-02-05 Janne Blomqvist <jb@gcc.gnu.org>
PR libfortran/47571

View File

@ -111,14 +111,12 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
if (zero_flag)
{
e = 0;
if (compile_options.sign_zero == 1)
sign = calculate_sign (dtp, sign_bit);
else
if (compile_options.sign_zero != 1)
sign = calculate_sign (dtp, 0);
/* Handle special cases. */
if (w == 0)
w = d + 2;
w = d + 1;
/* For this one we choose to not output a decimal point.
F95 10.5.1.2.1 */
@ -138,7 +136,6 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
*out = '0';
return SUCCESS;
}
}
/* Normalize the fractional component. */
@ -417,7 +414,10 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
/* Pick a field size if none was specified. */
if (w <= 0)
w = nbefore + nzero + nafter + (sign != S_NONE ? 2 : 1);
{
w = nbefore + nzero + nafter + (sign != S_NONE ? 2 : 1);
w = w == 1 ? 2 : w;
}
/* Work out how much padding is needed. */
nblanks = w - (nbefore + nzero + nafter + edigits + 1);
@ -436,7 +436,7 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
return FAILURE;
/* Check the value fits in the specified field width. */
if (nblanks < 0 || edigits == -1)
if (nblanks < 0 || edigits == -1 || w == 1 || (w == 2 && sign != S_NONE))
{
if (unlikely (is_char4_unit (dtp)))
{