如何把一个'f64'转换成一个'f32'?

How to convert a `f64` to a `f32`?

提问人:Reinis Mazeiks 提问时间:5/15/2022 更新时间:5/15/2022 访问量:4667

问:

我怎样才能把 a 转换为最接近的?f64f32

既没有实现也没有实现,大概是因为此类实现仅用于无损转换。我还在文档中搜索了引用,反之亦然,但一无所获。FromTryFromf32f64

    let double: f64 = 0.;

    // doesn't work
    // let single: f32 = double.into();
    // let single: f32 = double.try_into().unwrap();
Rust Casting 浮点 类型转换

评论


答:

15赞 Reinis Mazeiks 5/15/2022 #1

在这种情况下,我们可以使用关键字进行强制转换。对于整数转换,通常不需要它,因为“从较大的整数转换为较小的整数(例如 u32 -> u8)会截断”,这通常是不需要的。然而,对于 ,这是非常明智的:asf64f32

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

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

Rust 参考手册

    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