From aa7e7eff5ec165dc8463a0e74309801b15d1feda Mon Sep 17 00:00:00 2001 From: Dominique d'Humieres Date: Fri, 24 Jul 2020 20:27:53 +0200 Subject: PR 93567, G edit descriptor uses E instead of F editing in rounding mode UP. The switch between FMT_E and FMT_F is based on the absolute value. Set r=0 for rounding toward zero and r = 1 otherwise. If (exp_d - m) == 1 there is no rounding needed. libgfortran/ChangeLog: PR fortran/93567 * io/write_float.def (determine_en_precision): Fix switch between FMT_E and FMT_F. gcc/testsuite/ChangeLog: PR fortran/93567 * gfortran.dg/round_3.f08: Add test cases. --- libgfortran/io/write_float.def | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'libgfortran') diff --git a/libgfortran/io/write_float.def b/libgfortran/io/write_float.def index 3311db3..9a4462c 100644 --- a/libgfortran/io/write_float.def +++ b/libgfortran/io/write_float.def @@ -988,16 +988,19 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f, w = default_width;\ d = precision;\ }\ + /* The switch between FMT_E and FMT_F is based on the absolute value. \ + Set r=0 for rounding toward zero and r = 1 otherwise. \ + If (exp_d - m) == 1 there is no rounding needed. */\ switch (dtp->u.p.current_unit->round_status)\ {\ case ROUND_ZERO:\ - r = sign_bit ? 1.0 : 0.0;\ + r = 0.0;\ break;\ case ROUND_UP:\ - r = 1.0;\ + r = sign_bit ? 0.0 : 1.0;\ break;\ case ROUND_DOWN:\ - r = 0.0;\ + r = sign_bit ? 1.0 : 0.0;\ break;\ default:\ break;\ @@ -1005,7 +1008,8 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f, exp_d = calculate_exp_ ## x (d);\ r_sc = (1 - r / exp_d);\ temp = 0.1 * r_sc;\ - if ((m > 0.0 && ((m < temp) || (r >= (exp_d - m))))\ + if ((m > 0.0 && ((m < temp) || (r < 1 && r >= (exp_d - m))\ + || (r == 1 && 1 > (exp_d - m))))\ || ((m == 0.0) && !(compile_options.allow_std\ & (GFC_STD_F2003 | GFC_STD_F2008)))\ || d == 0)\ -- cgit v1.1