2017-06-05 3 views
1

Existe-t-il un moyen de convertir un nombre à virgule flottante (f32 ou f64) en un type de données auquel je peux accéder au niveau du bit, par exemple u32/u64? C'est-à-dire quelque chose correspondant à:Comment convertir float en binaire sans utiliser de code dangereux?

fn as_bits(i: f64) -> u64 { 
    unsafe { mem::transmute(i) } 
} 

mais sans le unsafe. Ce code est sûr par rules, même s'il ne peut pas retourner les mêmes valeurs sur toutes les plates-formes, en particulier pour les NaN. L'interface de sécurité inversée serait également agréable.

Répondre

5

Rust 1.20 introduit f64::to_bits et f32::to_bits:

fn main() { 
    println!("{}", (4.2f64).to_bits()) 
} 

Avant cela, vous devez utiliser la fonction dangereuse transmute. Ils produisent le même résultat:

use std::mem; 

fn main() { 
    let float = 4.2f64; 

    let via_method = float.to_bits(); 
    let via_transmute: u64 = unsafe { mem::transmute(float) }; 

    assert_eq!(via_method, via_transmute);  
}