It is non-deterministic mainly due to compilers that generate different code or when there are concurrent computations that are executed in an unpredictable order.
A single sequence of floating-point operations executed on an IEEE 754 compliant CPU has always been perfectly deterministic since the first version of the standard.
Who wants a deterministic computation must use a single-threaded program or a multi-threaded program where the order of execution is deterministic, and one must be careful so that changes in compiler versions or compilation options will not affect the type and order of the operations that are executed.