如何在不使用不安全代码的情况下将浮点数转换为二进制数?
How to convert float to binary without using unsafe code?
有没有办法将浮点数(f32
或 f64
)转换为我可以按位访问的数据类型,例如 u32
/u64
?也就是说,对应于:
fn as_bits(i: f64) -> u64 {
unsafe { mem::transmute(i) }
}
但没有 unsafe
。此代码根据 rules 是安全的,即使它可能不会 return 在所有平台上具有相同的值,特别是对于 NaN。反向安全接口也不错
引入了 Rust 1.20 f64::to_bits
and f32::to_bits
:
fn main() {
println!("{}", (4.2f64).to_bits())
}
在此之前,您需要使用不安全函数transmute
。它们产生相同的结果:
use std::mem;
fn main() {
let float = 4.2f64;
let via_method = float.to_bits();
let via_transmute: u64 = unsafe { mem::transmute(float) };
assert_eq!(via_method, via_transmute);
}
有没有办法将浮点数(f32
或 f64
)转换为我可以按位访问的数据类型,例如 u32
/u64
?也就是说,对应于:
fn as_bits(i: f64) -> u64 {
unsafe { mem::transmute(i) }
}
但没有 unsafe
。此代码根据 rules 是安全的,即使它可能不会 return 在所有平台上具有相同的值,特别是对于 NaN。反向安全接口也不错
引入了 Rust 1.20 f64::to_bits
and f32::to_bits
:
fn main() {
println!("{}", (4.2f64).to_bits())
}
在此之前,您需要使用不安全函数transmute
。它们产生相同的结果:
use std::mem;
fn main() {
let float = 4.2f64;
let via_method = float.to_bits();
let via_transmute: u64 = unsafe { mem::transmute(float) };
assert_eq!(via_method, via_transmute);
}