It doesn't. If we forget about FPU flags, floating-point multiplication is pure. That does not change anything to the fact that a * (b * c) is different from (a * b) * c.
The problem is not side-effects in multiplication. The problem is that * is not associative.
The problem is not side-effects in multiplication. The problem is that * is not associative.