2016-03-15 41 views
6

Ho bisogno di convertire mezze galleggianti memorizzate (16 bit) in galleggianti standard a 32 bit. Attualmente uso il codice qui sotto, ma si basa su libc. Voglio usare solo std e dovrebbe funzionare su Rust stabile.Come posso decodificare da f16 a f32 usando solo la libreria standard stabile?

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

perché non usi semplicemente https://doc.rust-lang.org/std/primitive.f32.html#method.ldexp e aspetti che diventi stabile? –

+0

Ora la cassa dovrebbe funzionare stabile. Inoltre, è improbabile che il metodo ldexp si stabilizzi. – Pyfisch

risposta

4

Si può solo sostituire ffi::c_ldexpf(x, y) con x * (2.0).powi(y). Funziona su tutti gli u16 s, secondo lo my exhaustive test.

+0

Ah! Le meraviglie di piccole gamme di input. –