5 releases

0.2.0 Feb 3, 2025
0.1.4 Feb 2, 2025
0.1.3 Jan 27, 2025
0.1.1 Feb 18, 2024

#372 in Math

Download history 20/week @ 2024-12-07 185/week @ 2025-01-25 269/week @ 2025-02-01 15/week @ 2025-02-08

469 downloads per month

MIT license

5KB

lower

lowers expressions to their "desugared" form.

e.g

a * b + c => (a.mul(b)).add(c)

note that it is extremely pervasive, so

lower::math! { fn main() -> u8 {
    const X: u8 = 31 * 2;
    return 2 * X + 2;
} }

expands to

fn main() -> u8 {
    const X: u8 = 31.mul(2);
    return (2.mul(X)).add(2);
}

it should work for most expressions.

also implements some modules that let it work with some core intrinsics (f*_fast, f*_algebraic). (nightly only!)

why

rust added an amazing feature called algebraic math (thanks orlp), allowing us to use f*_algebraic. however, dont you hate it when your

fn madd<const N: usize>(x: [[f32; 3]; N]) -> [f32; N] {
    x.map(|[a, b, c]| a * b + c) // not optimized! cant use `(v)fmadd`
}

turns into

fn madd<const N: usize>(x: [[f32; 3]; N]) -> [f32; N] {
    x.map(|[a, b, c]| core::intrinsics::fadd_algebraic(core::intrinsics::fmul_algebraic(a, b), c)) // readability in shambles
}

this crate allows you to

fn madd<const N: usize>(x: [[f32; 3]; N]) -> [f32; N] {
    // wow! such readability! ultimate simd!
    lower::algebraic! { x.map(|[a, b, c]| a * b + c) }
}

Dependencies

~220–660KB
~16K SLoC