Skip to main content

numeric_statistics/f32/
assert_eq_f32.rs

1/// assert_eq_f32: assert that two floating point numbers are within 2.0 * f32::EPSILON.
2///
3/// # Example
4///
5/// ```rust
6/// #[macro_use]
7/// use numeric_statistics::assert_eq_f32;
8/// let a: f32 = 0.333333333;
9/// let b: f32 = 1.0 / 3.0;
10/// assert_eq_f32!(a, b);
11/// ```
12///
13#[macro_export]
14macro_rules! assert_eq_f32 {
15    ($a:expr, $b:expr $(,)?) => {{
16        match (&$a, &$b) {
17            (a, b) => {
18                if (a == b) { return; }
19                let epsilon = f32::EPSILON * 2.0;
20                let abs_diff = if (a >= b) { a - b } else { b - a };
21                assert!(
22                    abs_diff <= epsilon,
23                    concat!(
24                        "assertion failed: `assert_eq_f32`\n",
25                        " left: {},\n",
26                        " right: {},\n",
27                        " abs_diff: {},\n",
28                        " ε: {}",
29                    ),
30                    a,
31                    b,
32                    abs_diff,
33                    epsilon
34                )
35            }
36        }
37    }};
38}