Hi,
I would like to know how I can "convert" (or re-map) a f64 to u64 in rust.
I am trying to translate my C code below to Rust :
uint64_t flip(double d) {
union {double d; uint64_t u64;} u;
u.d = d;
return u.u64 ^ (-(u.u64 >> 63) | 0x8000000000000000ULL);
}
In Julia for example, I would do something like:
function flip(x::Float64)
y = reinterpret(UInt64, x)
y ⊻ (-(y >> 63) | 0x8000000000000000)
end
I am looking for the fastest way to do the above.
Thank you.
Looks like f64::to_bits() does what you want.
Thank you for the feedback.
is this the correct way to write this function in rust?
fn flip(x: f64) -> u64 {
let y: u64 = x.to_bits();
return y ^ ((-((y >> 63) as i64) as u64 | 0x8000000000000000_u64) as u64);
}
You can negate u64 without as by 0.wrapping_sub(y >> 63). It shouldn't affect performance but arguably it's more readable IMO.
You can use an arithmetic right shift by 63 to make a mask that is all ones (resp. all zeros) if x is negative (resp. nonnegative). Use the signed_shr method from the num crate.
Do you have an example please? sorry I am very new to Rust.