如何将' f64 '转换为' f32 ' ?



如何将f64转换为最接近的f32?

既没有From也没有TryFrom实现,大概是因为这样的实现只提供无损转换。我还在f64文档中搜索了f32的引用,反之亦然,没有发现任何内容。

let double: f64 = 0.;
// doesn't work
// let single: f32 = double.into();
// let single: f32 = double.try_into().unwrap();

在这种情况下,我们可以使用as关键字进行强制转换。通常不希望进行整数转换,因为从一个较大的整数转换为一个较小的整数(例如u32 ->U8)将截断,这通常是不希望的。然而,对于f64f32,这是非常明智的:

从f64转换到f32将产生最接近的f32

  • 如果需要,舍入是根据roundTiesToEven模式
  • 溢出时,产生无穷大(与输入相同的符号)

锈参考

let double: f64 = 42.;
dbg!(double as f32);
[src/main.rs:13] double as f32 = 42.0

如果不希望溢出到无穷大,而您想要恐慌,最简单的解决方案可能是检查is_finite:

fn f64_to_f32(x: f64) -> f32 {
let y = x as f32;
assert_eq!(
x.is_finite(),
y.is_finite(),
"f32 overflow during conversion"
);
y
}
fn main() {
dbg!(f64_to_f32(42_f64));
// dbg!(f64_to_f32(f64::MAX / 10.)); // panics
dbg!(f64_to_f32(f64::NAN));
dbg!(f64_to_f32(f64::INFINITY));
dbg!(f64_to_f32(f64::NEG_INFINITY));
}
[src/main.rs:2] f64_to_f32(42_f64) = 42.0
[src/main.rs:4] f64_to_f32(f64::NAN) = NaN
[src/main.rs:5] f64_to_f32(f64::INFINITY) = inf
[src/main.rs:6] f64_to_f32(f64::NEG_INFINITY) = -inf

最新更新