2016-03-15 22 views
6

我需要將存儲的半浮點數(16位)轉換爲標準的32位浮點數。我目前使用下面的代碼,但它依賴於libc。我只想使用std,它應該在穩定的Rust上工作。如何使用穩定的標準庫將f16解碼爲f32?

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

爲什麼你不使用https://doc.rust-lang.org/std/primitive.f32.html#method.ldexp並等待它穩定? –

+0

箱子應該現在穩定工作。另外,ldexp方法不太可能穩定。 – Pyfisch

回答

4

您可以用x * (2.0).powi(y)替換ffi::c_ldexpf(x, y)。根據my exhaustive test,這適用於所有u16

+0

啊!小範圍的輸入的奇蹟。 –

相關問題