It's well known that IEEE floating-point multiplication is not associative. However, consider the special case where a, b, and c are 32-bit signed integers (in C):
double da = (double) a;
double db = (double) b;
double dc = (double) c;
Now, does da*(db*dc) == (da*db)*dc always return 1? Here, doubles are 64-bit double-precision IEEE floating point numbers. Round-to-even is being used.
I tried several examples by hand, such as a = pow(2, 30) + 1, b = pow(2, 30)+1, c = pow(2, 30) + pow(2, 6), numbers large enough to ensure there would be some rounding involved, because the exact mathematical answer has no representation.
Unfortunately, I couldn't find a counterexample. This expression looks like it may return 0. Could it possibly always return 1? Why?