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}