Although I generally agree with the first sentence, everything past that is incorrect.
“compilers can and do change the order of calculations”: with specifically known set of rules which are language specific and may depend on programmer specs in code and/or compiler settings.
“in ways that are permitted by the normal laws of arithmetic”: if you mean Z/Zn integers and IEEE spec FP then okay, otherwise no. The only tricky part is FP functions that are not required to be properly rounded. You have to know what they are and not use them for exact computation everywhere.
“but which no floating point implementation can actually follow.” IEEE FP rules aren’t black magic and if you don’t use variable ULP functions and disallow any compiler transforms that change error bound then all computations are bit-exact. That’s one of the main points of the spec in the first place.