kala 2.0.0

Timing with nanosecond precision on multiple architectures.
Documentation
use speculoos::prelude::*;

const fn fudge_down(value: f64, relative_error: f64) -> f64 {
  value * (1.0 - relative_error)
}
const fn fudge_up(value: f64, relative_error: f64) -> f64 {
  value * (1.0 + relative_error)
}

// Asserts `left` and `right` are equal while allowing for a relative error.
// `allowed_relative_error` should be a value in the (0.0, 0.5) range. For
// instance, `allowed_relative_error` of `0.05` allows for a +-5% difference.
pub fn assert_roughly_eq(left: f64, right: f64, allowed_relative_error: f64) {
  assert!(allowed_relative_error < 0.5 && allowed_relative_error > 0.0);

  assert_that(&left).is_less_than(fudge_up(right, allowed_relative_error));
  assert_that(&left).is_greater_than(fudge_down(right, allowed_relative_error));
}

#[cfg(test)]
mod tests {
  use super::*;

  #[test]
  fn assert_roughly_eq_basic() {
    assert_roughly_eq(100.0, 98.0, 0.03);
    assert_roughly_eq(100.0, 101.0, 0.03);
  }
}