Jakob Andreas Bærentzen wrote:
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?

This is the infamous x86 "excess precision" problem, which has been discussed in PR 323 and elsewhere.
    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=323

The problem is that the x87 FP register stack has 80 bit registers. Doubles are 64-bits. If you aren't careful (or if the compiler isn't), then you can end up comparing a full unrounded 80-bit value against a rounded 64-bit value, which will not be equal. Thus the result that you are seeing.

There are various ways to work around this, but unfortunately, there is no good solution to the problem that makes everyone happy. The hardware design and the linux ABI design makes it difficult for the compiler to both get the right answer and give good performance. This problem has gone unsolved for well over a decade, and may never be solved.

This problem can be avoided by using SSE registers instead of the x87 FP register stack. If you are running 64-bit linux on an AMD64/EM64T system, you won't have this problem, because they use the SSE registers by default.
--
Jim Wilson, GNU Tools Support, http://www.specifix.com

Reply via email to