If I run the following code:
#include <stdio.h>
int main(int argc, char* argv[])
{
float a = 0.1;
float b = 0.2;
float c = 0.3;
float d = 0.4;
float result1 = a + b + c + d - c;
float result2 = a + b + c + (d - c);
float result3 = a + b + d;
printf("result1 == result2: %s\n", result1 == result2 ? "Yes" : "No");
printf("result2 == result3: %s\n", result2 == result3 ? "Yes" : "No");
printf("result1 == result3: %s\n\n", result1 == result3 ? "Yes" : "No");
printf("result1: %30.20f\n", result1);
printf("result2: %30.20f\n", result2);
printf("result3: %30.20f\n\n", result3);
printf("a + b: %30.20f\n", a + b);
printf("a + b + c: %30.20f\n", a + b + c);
printf("a + b + c + d: %30.20f\n", a + b + c + d);
printf("d - c: %30.20f\n", d - c);
printf("a + b + c + d - c: %30.20f\n", a + b + c + d - c);
printf("a + b + c + (d - c): %30.20f\n", a + b + c + (d - c));
printf("a + b + d: %30.20f\n", a + b + d);
return 0;
}
I get the following output, showing that the answer to your main question is NO:
result1 == result2: No
result2 == result3: Yes
result1 == result3: No
result1: 0.69999998807907104492
result2: 0.70000004768371582031
result3: 0.70000004768371582031
a + b: 0.30000001192092895508
a + b + c: 0.60000002384185791016
a + b + c + d: 1.00000000000000000000
d - c: 0.09999999403953552246
a + b + c + d - c: 0.69999998807907104492
a + b + c + (d - c): 0.70000004768371582031
a + b + d: 0.70000004768371582031
Compiler: Apple LLVM 5.1 (clang).
I get the same results with one, but not with another compiler I tried with. The last one uses the x86 FPU in 32 bit code. The other two run in 64 bit mode and use SSE2, AFAIK.