Comparison Failure on Linux

: Suppose we have the following code fragment:
: double d1 = (a + b)/2.0;
: double d2 = (a + b)/2.0;   /* with identical a and identical b */
: Is d1 == d2 ALWAYS true? I found that it is not. 
Assuming you are talking about Linux on an Intel x86 machine, no. The results depend upon the level of optimization you choose, and other code near the above. The comparison may fail if gcc is able to keep one of d1 or d2 in an FPU register but not the other. Linux operates the FPU in 64 bit precision mode. The expression (a + b)/2.0 will always be computed to 64 bit precision. A "double" has 53 bit precision. When the comparison is performed, it may be comparing a 64 bit precision result (the number which gcc has been able to keep in an FPU register) with a 53 bit precision result (the number which gcc had to store in memory, converting to 53 bit precision, and later retrieve). The two numbers will usually not be equal. The moral of the story is to "never rely upon exact comparisons of floating point numbers" (unless you *really* know what is happening).
: I am using gcc-2.7.2 on Linux 1.2.13. It seems that d1 and d2 can differ by
: an multiplicative factor (1.0 +/- DBL_EPSILON). Is this a normal behavior?
The difference is not DBL_EPSILON, but something less than that.