[Bug libfortran/59774] [Regression] Inconsistent rounding between -m32 and -m64
dominiq at lps dot ens.fr
gcc-bugzilla@gcc.gnu.org
Sun Jan 12 15:06:00 GMT 2014
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59774
--- Comment #5 from Dominique d'Humieres <dominiq at lps dot ens.fr> ---
For the tests in comment 1, I think PR323 strikes back again. I the same
results for both -m32 and -m64 with the following patch
--- ../_clean/libgfortran/io/write_float.def 2014-01-04 15:51:53.000000000
+0100
+++ libgfortran/io/write_float.def 2014-01-12 15:55:24.000000000 +0100
@@ -1043,10 +1043,11 @@ output_float_FMT_G_ ## x (st_parameter_d
break;\
}\
\
- rexp_d = calculate_exp_ ## x (-d);\
- if ((m > 0.0 && ((m < 0.1 - 0.1 * r * rexp_d) || (rexp_d * (m + r) >=
1.0)))\
+ rexp_d = calculate_exp_ ## x (d);\
+ if ((m > 0.0 && ((10.0 * rexp_d * m < rexp_d - r ) || ((m + r) >= rexp_d)))\
|| ((m == 0.0) && !(compile_options.allow_std\
- & (GFC_STD_F2003 | GFC_STD_F2008))))\
+ & (GFC_STD_F2003 | GFC_STD_F2008)))\
+ || d == 0)\
{ \
newf.format = FMT_E;\
newf.u.real.w = w;\
@@ -1069,7 +1070,7 @@ output_float_FMT_G_ ## x (st_parameter_d
volatile GFC_REAL_ ## x temp;\
mid = (low + high) / 2;\
\
- temp = (calculate_exp_ ## x (mid - 1) * (1 - r * rexp_d));\
+ temp = (calculate_exp_ ## x (mid - 1) * (rexp_d - r) / rexp_d);\
\
if (m < temp)\
{ \
I think in order to avoid overflows (10.0 * rexp_d * m < rexp_d - r ) and ((m +
r) >= rexp_d) should be exchanged.
More information about the Gcc-bugs
mailing list