------- Comment #16 from dominiq at lps dot ens dot fr 2008-12-22 16:29 -------
>From http://gcc.gnu.org/ml/fortran/2008-12/msg00284.html:
> With Steve Kargl's help, the following simple patch was found to eliminate
> this output
> problem on x86-64. I plan to commit under simple and makes sense to do rule.
Is not the same problem lurking in
if ((m > 0.0 && m < 0.1 - 0.05 / exp_d) || (m >= exp_d - 0.5 ) ||\
with 0.1 and 0.05?
Also there is probably some room for optimization in this piece of code. For
instance calculate_exp_* computes 10**d through an algorithm linear in d, while
it could be computed in O(log2(d)) (see poweri in gcc/builtins.c). Also the
following change:
--- /opt/gcc/_gcc_clean/libgfortran/io/write_float.def 2008-12-21
22:31:05.000000000 +0100
+++ /opt/gcc/gcc-4.4-work/libgfortran/io/write_float.def 2008-12-22
16:27:10.000000000 +0100
@@ -640,8 +640,8 @@
GFC_REAL_ ## x temp;\
mid = (low + high) / 2;\
\
- temp = 0.1 * calculate_exp_ ## x (mid) - 0.5\
- * calculate_exp_ ## x (mid - d - 1);\
+ temp = calculate_exp_ ## x (mid) \
+ * (1.0 - 0.5 / exp_d) / 10;\
\
if (m < temp)\
{ \
speeds up by ~2s the following test:
character(80) s
real*8 x, y
integer i
x=1.0
y=0.0
do i = 1, 10000000
write(s,*) y
y = y + x
end do
print *, s
end
(still twice slower with gfortran than ifort or g77).
Note that "temp = calculate_exp_ ## x (mid-1) * (1.0 - 0.5 / exp_d)" is
slightly slower.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37472