#[allow(unused_macros)]
macro_rules! assert_eq_err {
($actual:expr, $expected:expr, $max_err:expr) => {{
assert_eq_err!($actual, $expected, $max_err, "");
}};
($actual:expr, $expected:expr, $max_err:expr, $note:expr) => {{
let (actual, expected): (&f64, &f64) = (&$actual, &$expected);
let max_err = $max_err;
let note = $note;
let error = (
(*actual - *expected) /
if *expected == 0.0 { *expected + 0.000001 } else { *expected }
).abs();
assert!(
error <= max_err,
"assertion failed: `(left !== right)` \
(left: `{:?}`, right: `{:?}`, expected error: `{:?}`, real error: `{:?}`){}{}",
*actual,
*expected,
max_err,
error,
if note.len() > 0 { " - " } else { "" },
note
);
}};
}