Bug 14367

Summary: inconsistent floating point results in C++ operator *= method
Product: gcc Reporter: Diab Jerius <djerius>
Component: c++Assignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED DUPLICATE    
Severity: critical CC: gcc-bugs
Priority: P2    
Version: 3.3.3   
Target Milestone: ---   
Host: i486-linux Target:
Build: Known to work:
Known to fail: Last reconfirmed:

Description Diab Jerius 2004-03-01 16:56:24 UTC
A floating point calculation returns different results when performed in a
class's *= method vs. in main().  I'm not sure if the *= method is special, but
that's where it shows up.  The inconsistency is triggered by particular values
used in the calculation. 

I've seen this behavior in 3.3.3, and 3.2.3.  It does not appear in 3.1.
I've seen the behavior in the Debain (unstable) version of 3.3.3, as well as in
a personally compiled version of 3.2.3.  The resultant compiled code exhibits
the inconsistency on an AthlonMP, an Athlon, and an Intel Xeon.


At the end of this message is a uuencoded preprocessed program which exhibits
the behavior.  The code prints out the input and resultant values for the
calculation as done in the *= method and in main.  The resultant values should
be the same, but differ.  On my machines, here's the output:

1> 1582081461419629824 = 1804289383 * 1681692777 - 846930886 * 1714636915
2> 1582081461419630080 = 1804289383 * 1681692777 - 846930886 * 1714636915
1 != 2

The second value is the correct one.


malaise% /usr/bin/g++ -v -save-temps -O2 std_complex_dbl.cc -o std_complex_dbl
Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.3/specs
Configured with: ../src/configure -v
--enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr
--mandir=/usr/share/man --infodir=/usr/share/info
--with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared --with-system-zlib
--enable-nls --without-included-gettext --enable-__cxa_atexit
--enable-clocale=gnu --enable-debug --enable-java-gc=boehm
--enable-java-awt=xlib --enable-objc-gc i486-linux
Thread model: posix
gcc version 3.3.3 (Debian)
 /usr/lib/gcc-lib/i486-linux/3.3.3/cc1plus -E -D__GNUG__=3 -quiet -v
-D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=3 -D_GNU_SOURCE
std_complex_dbl.cc -O2 std_complex_dbl.ii
ignoring nonexistent directory "/usr/i486-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/3.3
 /usr/include/c++/3.3/i486-linux
 /usr/include/c++/3.3/backward
 /usr/local/include
 /usr/lib/gcc-lib/i486-linux/3.3.3/include
 /usr/include
End of search list.
 /usr/lib/gcc-lib/i486-linux/3.3.3/cc1plus -fpreprocessed std_complex_dbl.ii
-quiet -dumpbase std_complex_dbl.cc -auxbase std_complex_dbl -O2 -version -o
std_complex_dbl.s
GNU C++ version 3.3.3 (Debian) (i486-linux)
        compiled by GNU C version 3.3.3 (Debian).
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
 as -V -Qy -o std_complex_dbl.o std_complex_dbl.s
GNU assembler version 2.14.90.0.7 (i386-linux) using BFD version 2.14.90.0.7
20031029 Debian GNU/Linux
 /usr/lib/gcc-lib/i486-linux/3.3.3/collect2 --eh-frame-hdr -m elf_i386
-dynamic-linker /lib/ld-linux.so.2 -o std_complex_dbl
/usr/lib/gcc-lib/i486-linux/3.3.3/../../../crt1.o
/usr/lib/gcc-lib/i486-linux/3.3.3/../../../crti.o
/usr/lib/gcc-lib/i486-linux/3.3.3/crtbegin.o -L/usr/lib/gcc-lib/i486-linux/3.3.3
-L/usr/lib/gcc-lib/i486-linux/3.3.3/../../.. std_complex_dbl.o -lstdc++ -lm
-lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc-lib/i486-linux/3.3.3/crtend.o
/usr/lib/gcc-lib/i486-linux/3.3.3/../../../crtn.o

begin 644 std_complex_dbl.ii.bz2
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
A4MW@<*HY.V$`D!D$D!_J$B<^#8213_Q=R13A0D*0X(/`
`
end
Comment 1 Andrew Pinski 2004-03-01 17:28:47 UTC
In fact neither is correct (well really both are as for rounding errors which can happen and does).
The correct answer is 1582081461419629901.
But really this is a non-bug as you are dealing with FP and x86 where different precision can happen.
This is a dup of bug 323.

*** This bug has been marked as a duplicate of 323 ***