aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authordominiq <dominiq@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-30 20:47:45 +0000
committerdominiq <dominiq@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-30 20:47:45 +0000
commit91c9586dfef47f2d162fad8eb6e3fd2f88955775 (patch)
tree83e4ed7f4cc6fe0a7e0a7a58ff4368d3c788b7ff /libgfortran
parentac8ec81c4428ae3b9205c86793f1b3e17ac26d6f (diff)
2016-03-30 Jerry DeLisle <jvdelisle@gcc.gnu.org>
Dominique d'Humieres <dominiq@lps.ens.fr> PR libgfortran/70235 * io/write_float.def: Fix PF format for negative values of the scale factor. 2016-03-30 Dominique d'Humieres <dominiq@lps.ens.fr> Jerry DeLisle <jvdelisle@gcc.gnu.org> * gfortran.dg/fmt_pf.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234600 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog7
-rw-r--r--libgfortran/io/write_float.def26
2 files changed, 26 insertions, 7 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 6a742b50597..688a16e8d8b 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,10 @@
+2016-03-30 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+ Dominique d'Humieres <dominiq@lps.ens.fr>
+
+ PR libgfortran/70235
+ * io/write_float.def: Fix PF format for negative values of the scale
+ factor.
+
2016-03-28 Alessandro Fanfarillo <fanfarillo.gcc@gmail.com>
* caf/libcaf.h: caf_stop_numeric and caf_stop_str prototype.
diff --git a/libgfortran/io/write_float.def b/libgfortran/io/write_float.def
index d4270193656..d32440f6f9b 100644
--- a/libgfortran/io/write_float.def
+++ b/libgfortran/io/write_float.def
@@ -184,9 +184,6 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
memmove (digits + nbefore, digits + nbefore + 1, p);
digits[nbefore + p] = '.';
nbefore += p;
- nafter = d - p;
- if (nafter < 0)
- nafter = 0;
nafter = d;
nzero = 0;
}
@@ -204,12 +201,27 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
{
nzero = -(nbefore + p);
memmove (digits + 1, digits, nbefore);
- digits++;
- nafter = d + nbefore;
+ nafter = d - nzero;
+ if (nafter == 0 && d > 0)
+ {
+ /* This is needed to get the correct rounding. */
+ memmove (digits + 1, digits, ndigits - 1);
+ digits[1] = '0';
+ nafter = 1;
+ nzero = d - 1;
+ }
+ else if (nafter < 0)
+ {
+ /* Reset digits to 0 in order to get correct rounding
+ towards infinity. */
+ for (i = 0; i < ndigits; i++)
+ digits[i] = '0';
+ digits[ndigits - 1] = '1';
+ nafter = d;
+ nzero = 0;
+ }
nbefore = 0;
}
- if (nzero > d)
- nzero = d;
}
}
else