snippets/Rust-round-f32-using-arithm...

1.1 KiB

round/floor a f32 using logical operations and integer arithmetical operations in Rust

Yith this function you can able to truncate a float f32 using bitwise, logical operations and integer arithmetical operation.
The function has not 100% of precisition because ignore most of the bits in the mantissa, but it's often to round small numbers.

fn round(mut f: f32) -> i32 {
    let sign = f < 0.0;
    if sign {
        f = f * -1.0;
    }
    
    let digits = f.to_bits();

    let mut exponent = (digits as i32 >> 23) & (!(1 << 8));
    let mantissa = (digits - (digits >> 23 << 23)) >> 16 | 1 << 7;
    
    exponent -= 127;

    if exponent < 0 {
        return 0;
    }
    let exponent: u32 = 1 << exponent as u32;

    let mut result: i32 = (exponent * mantissa) as i32 / 128;
    if sign {
       result *= -1;
    }
    result
}

fn main() {
    println!("{}", round(15.125));
    println!("{}", round(14.345));
    println!("{}", round(-1.555));
    println!("{}", round(-9.001));
    println!("{}", round(-999.001));
    println!("{}", round(-0.5));
}