==operator gives unexpected result using -O0
Jakob Andreas Bærentzen
jab@imm.dtu.dk
Tue Jul 26 13:05:00 GMT 2005
Hello,
I do apologize if my ignorance is the problem here, but I am having a strange
problem with the version of gcc included in suse 9.3: gcc version 3.3.5
20050117 (prerelease) (SUSE Linux). The same problem was observed with gcc
3.3.1. I have not tried later versions, but I can't find the problem in
bugzilla so I assume it is either so trivial that I should be ashamed or
unknown. It is an intel XEON processor.
It seems to me that if a,b, and c are float or double values and if a has been
assigned b*c
then
a == (b*c)
should return true since a should contain the same bitpattern as the temporary
being assigned the value of b*c. Is it not so?
Never the less, the following piece of code does not work as expected when
compiling with -O0. It works FINE when compiling with -O1 or higher.
-----------
#include <iostream>
using namespace std;
int main()
{
double b = 9.5245435435564536;
double c = 7.98786542345446565;
double a = b*c;
//Does not work.
cout << (a == (b*c)) << endl;
// Works
double d = b*c;
cout << (a == d) << endl;
}
-----------
With O0 the output is
0
1
With O1, O2 or O3 the output is
1
1
as one would expect.
I have made a similar program in C and I also changed double to float. It
makes no difference. Nor does the actual float/double values. The
optimization flag seems to decide what happens.
Any insight would be appreciated.
Andreas
More information about the Gcc-bugs
mailing list