logprob 0.4.0

A wrapper around floats to handle log probabilities
Documentation
use core::f64;
use divan::Bencher;
use logprob::LogProb;
use num_traits::Float;

fn main() {
    divan::main();
}
const N: usize = 100;

fn p_and_q<T: Float + From<u16>>() -> (Vec<LogProb<T>>, Vec<LogProb<T>>) {
    let log_p: Vec<_> = (0..N)
        .map(|i| LogProb::new(-(<T as From<u16>>::from((i + 2) as u16))).unwrap())
        .collect();
    let log_q: Vec<_> = (0..N)
        .map(|i| LogProb::new(-(<T as From<u16>>::from(i as u16))).unwrap())
        .collect();
    (log_p, log_q)
}

#[divan::bench(types=[f64,f32])]
fn subtract_op<T: Float + From<u16> + Sync>(bencher: Bencher) {
    let (p, q) = p_and_q::<T>();
    bencher.bench(|| {
        for (x, y) in p.iter().zip(&q) {
            _ = divan::black_box(*x) - divan::black_box(*y);
        }
    });
}

#[divan::bench(types=[f64,f32])]
fn unchecked_sub<T: Float + From<u16> + Sync>(bencher: Bencher) {
    let (p, q) = p_and_q::<T>();
    bencher.bench(|| {
        for (x, y) in p.iter().zip(&q) {
            unsafe {
                _ = divan::black_box(x).unchecked_sub(*divan::black_box(y));
            }
        }
    });
}

#[divan::bench(types=[f64,f32])]
fn saturating_sub<T: Float + From<u16> + Sync>(bencher: Bencher) {
    let (p, q) = p_and_q::<T>();
    bencher.bench(|| {
        for (x, y) in p.iter().zip(&q) {
            _ = divan::black_box(x).saturating_sub(*divan::black_box(y));
        }
    });
}

#[divan::bench(types=[f64,f32])]
fn try_sub<T: Float + From<u16> + Sync>(bencher: Bencher) {
    let (p, q) = p_and_q::<T>();
    bencher.bench(|| {
        for (x, y) in p.iter().zip(&q) {
            _ = divan::black_box(x).try_sub(*divan::black_box(y)).unwrap();
        }
    });
}

#[divan::bench(types=[f64,f32])]
fn checked_sub<T: Float + From<u16> + Sync>(bencher: Bencher) {
    let (p, q) = p_and_q::<T>();
    bencher.bench(|| {
        for (x, y) in p.iter().zip(&q) {
            _ = divan::black_box(x)
                .checked_sub(*divan::black_box(y))
                .unwrap();
        }
    });
}