Floating point 如何仅使用稳定的标准库将f16解码为f32?

Floating point 如何仅使用稳定的标准库将f16解码为f32?,floating-point,rust,precision,Floating Point,Rust,Precision,我需要将存储的半浮点数(16位)转换为标准的32位浮点数。我目前使用下面的代码,但它依赖于libc。我只想使用std,它应该可以在稳定的锈迹上工作 #[inline] fn decode_f16(half: u16) -> f32 { let exp: u16 = half >> 10 & 0x1f; let mant: u16 = half & 0x3ff; let val: f32 = if exp == 0 { ff

我需要将存储的半浮点数(16位)转换为标准的32位浮点数。我目前使用下面的代码,但它依赖于libc。我只想使用
std
,它应该可以在稳定的锈迹上工作

#[inline]
fn decode_f16(half: u16) -> f32 {
    let exp: u16 = half >> 10 & 0x1f;
    let mant: u16 = half & 0x3ff;
    let val: f32 = if exp == 0 {
        ffi::c_ldexpf(mant as f32, -24)
    } else if exp != 31 {
        ffi::c_ldexpf(mant as f32 + 1024f32, exp as isize - 25)
    } else if mant == 0 {
        ::std::f32::INFINITY
    } else {
        ::std::f32::NAN
    };
    if half & 0x8000 != 0 {
        -val
    } else {
        val
    }
}

您可以用
x*(2.0).powi(y)
替换
ffi::c_ldexpf(x,y)
。这适用于所有
u16
s,根据。

为什么不直接使用并等待它稳定下来?板条箱现在应该可以稳定工作了。此外,ldexp方法不太可能稳定。