簡體   English   中英

如何僅使用穩定的標准庫將f16解碼為f32?

[英]How can I decode f16 to f32 using only the stable standard library?

我需要將存儲的半浮點數(16位)轉換為標准的32位浮點數。 我目前使用下面的代碼,但是它依賴libc。 我只想使用std ,它應該可以在穩定的Rust上工作。

#[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
    }
}

您可以將ffi::c_ldexpf(x, y)替換為x * (2.0).powi(y) 根據我的詳盡測試 ,此方法適用於所有u16

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM