The precision of this function is non-deterministic. This means it varies by platform, Rust version, and can even differ within the same execution from one invocation to the next.
Does this mean that even when passed the same inputs these functions are non-deterministic (ignoring the user changing the hardware rounding mode between executions) or rather that while one set of inputs may result in e.g. 5 ULPs of error while another may give e.g. 3 and Rust gives no upper bound on the ULPs of error?
Yes, even the same inputs can give different outputs. The typical way that happens is that the optimizer will give answers accurate to half-ULP -- the best possible -- but your runtime math library might not be that accurate.
If you're trying to do portably-deterministic floating point, you'll need to use your own math library for everything but +-*/%√.
libm provides pure-Rust floating-point functions, so if all you need is determinism, that'll solve your problems. It doesn't document any guarantees about stability of the results across versions, though.