diff options
Diffstat (limited to 'libgfortran/io/write.c')
-rw-r--r-- | libgfortran/io/write.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c index 4e22b703ea8..f98ec1f1f36 100644 --- a/libgfortran/io/write.c +++ b/libgfortran/io/write.c @@ -425,9 +425,12 @@ output_float (fnode *f, double value, int len) } /* Round the value. */ - if (nbefore + nafter < ndigits && nbefore + nafter > 0) + if (nbefore + nafter == 0) + ndigits = 0; + else if (nbefore + nafter < ndigits) { - i = nbefore + nafter; + ndigits = nbefore + nafter; + i = ndigits; if (digits[i] >= '5') { /* Propagate the carry. */ @@ -513,6 +516,16 @@ output_float (fnode *f, double value, int len) if (out == NULL) return; + /* Zero values always output as positive, even if the value was negative + before rounding. */ + for (i = 0; i < ndigits; i++) + { + if (digits[i] != '0') + break; + } + if (i == ndigits) + sign = calculate_sign (0); + /* Work out how much padding is needed. */ nblanks = w - (nbefore + nzero + nafter + edigits + 1); if (sign != SIGN_NONE) |