Is there anything obviously bad / unsafe / UB / DONT-USE-THIS / wrong with my impl ? I think it's okay because I'm literally, for PartialEq, Eq, and Hash, treating the f64 as it's 8 little endian bytes.
The behavior resulting from either logic error is not specified, but will be encapsulated to the HashMap that observed the logic error and not result in undefined behavior. This could include panics, incorrect results, aborts, memory leaks, and non-termination.
Since you already have to deal with converting between (wrapping) f64 and F64, it's tempting to just have type F64 = u64; and have the conversion operation be .to_bits(), but which is more clear in practice is probably subjective.
"Unspecified" is a common phrase for it. I think it's important to keep UB, where the compiler itself is released from its as-if chains, in its own category. Creating a way to constrain possible sources of UB is one of Rust's crowing achievements, after all.
something similar can be said of library code (including non-local consequences) when a logical invariant fails. The library can do anything (unless at it's behavior is least partially specified).
I just sometimes have the feeling that in the Rust world logical errors are treated much more lightly than they deserve while their range of consequences is quite similar to that of UB (only the mechanism is different).
But other than that: I just checked the docs for HashMap and found (and noticed you quoted it too) this (emphasis added by me):
The behavior resulting from either logic error [...] will be encapsulated to the HashMap that observed the logic error [...].
... which I think is the second most important (after the not-being-UB part) thing to mention. And it is much more restrictive specification than "anything that's not UB".