1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
use std::fmt::Debug; use std::ops::Sub; /// Asserts if a floating point is within some epsilon. This allows /// you to compare calculations to make sure it's within some error factor /// of accuracy. /// /// This one should pass /// ``` /// use extra_asserts::assert_approx_eq; /// let x : f64 = 10.123456789; /// let y : f64 = 10.123467890; /// assert_approx_eq(x, y, &1e-4); /// ``` /// /// This one should fail /// ```should_panic /// use extra_asserts::assert_approx_eq; /// let x : f64 = 10.123456789; /// let y : f64 = 10.123467890; /// assert_approx_eq(x, y, &1e-10); /// ``` pub fn assert_approx_eq<T>(l: T, r: T, epsilon: &T::Output) where T: Sub + PartialOrd + Debug + Copy, T::Output: Debug + PartialOrd, { let diff = if l < r { r - l } else { l - r }; assert!(diff < *epsilon, format!("{:?} != {:?}", l, r)); }