evobench_tools/utillib/
integers.rs

1// XX again, had something like this somewhere (did I do it wrongly there?) (ah stats? where?)
2pub fn rounding_integer_division(a: usize, b: usize) -> usize {
3    let a = u128::try_from(a).expect("always works");
4    let b = u128::try_from(b).expect("always works");
5    let usize_max = u128::try_from(usize::MAX).expect("always works");
6
7    let r = (a * usize_max + (b >> 1) * usize_max) / (b * usize_max);
8    usize::try_from(r).expect("always fits")
9}
10
11#[test]
12fn t_rounding_integer_division() {
13    let t = rounding_integer_division;
14    //                                 multiplying back:
15    assert_eq!(t(33126, 1), 33126); // 33126
16    assert_eq!(t(33126, 2), 16563); // 33126
17    assert_eq!(t(33126, 3), 11042); // 33126
18    assert_eq!(t(33126, 4), 8282); //  33128
19    assert_eq!(t(33126, 9464), 4); //  37856
20    assert_eq!(t(33126, 9465), 3); //  28395
21    assert_eq!(t(33126, 12000), 3); // 36000
22    assert_eq!(t(33126, 13563), 2); // 27126
23    assert_eq!(t(33126, 16563), 2); // 33126
24    assert_eq!(t(33126, 22083), 2); // 44166
25    assert_eq!(t(33126, 22084), 2); // 44168
26    assert_eq!(t(33126, 22085), 1); // 22085 -- the lowest possible
27    assert_eq!(t(33126, 33126), 1); // 33126
28}