summaryrefslogtreecommitdiff
path: root/meap/meap-code/ch5/ch5-u8-to-mock-rand.rs
blob: 46ac91add8e1f0cf8af02c852b08df35950c59eb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// fn mock_rand(n: u8) -> f32 {
//     (n as f32) / 255.
// }

fn mock_rand(n: u8) -> f32 {
    let base: u32 = 0b0_01111110_00000000000000000000000; // <1> Underscores mark the sign/mantissa/exponent boundaries
    let large_n =  (n as u32) << 15; // <2> Align the input byte `n` to 32 bits, then increase its value  by shifting its bits 15 places to the left 
    let f32_bits = base | large_n; // <3> Take a bitwise OR, merging the base with the input byte
    let m = f32::from_bits(f32_bits);// <4> Interpret `f32_bits` (which is type `u32`) as an `f32`
    2.0 * ( m - 0.5 ) // <5> Normalize the output range
}

fn main() {
    println!("max of input range: {:08b} -> {}", 0xff, mock_rand(0xff));
    println!("mid of input range: {:08b} -> {}", 0x77, mock_rand(0x77));
    println!("min of input range: {:08b} -> {}", 0x00, mock_rand(0x00));    
}