#[macro_export]
macro_rules! assert_eq_float {
(@standard $left:ident, $right:ident, $error:ident) => {
if $left != $right {
use $crate::FloatExt as _;
let d_abs = ($left - $right).abs();
::core::assert!(
d_abs < $error,
"assertion failed: `(left == right)`\n left: `{:?}`,\n right: `{:?}`\n diff: `{:?}`\n error: `{:?}`",
$left,
$right,
d_abs,
$error,
);
}
};
(@custom $left:ident, $right:ident, $error:ident; $($arg:tt)+) => {
if $left != $right {
use $crate::FloatExt as _;
let d_abs = ($left - $right).abs();
::core::assert!(
d_abs < $error,
$($arg)+
);
}
};
($left:expr, $right:expr $(,)?) => {{
let left = $left;
let right = $right;
let error = $crate::get_error(left, right);
$crate::assert_eq_float!(@standard left, right, error);
}};
($left:expr, $right:expr; $($arg:tt)+) => {{
let left = $left;
let right = $right;
let error = $crate::get_error(left, right);
$crate::assert_eq_float!(@custom left, right, error; $($arg)+);
}};
($left:expr, $right:expr, $error:expr $(,)?) => {{
let left = $left;
let right = $right;
let error = $error;
$crate::assert_eq_float!(@standard left, right, error);
}};
($left:expr, $right:expr, $error:expr; $($arg:tt)+) => {{
let left = $left;
let right = $right;
let error = $error;
$crate::assert_eq_float!(@custom left, right, error; $($arg)+);
}};
}
#[macro_export]
macro_rules! debug_assert_eq_float {
($left:expr, $right:expr $(,)?) => {
#[cfg(debug_assertions)]
$crate::assert_eq_float!($left, $right);
};
($left:expr, $right:expr; $($arg:tt)+) => {
#[cfg(debug_assertions)]
$crate::assert_eq_float!($left, $right; $($arg)+);
};
($left:expr, $right:expr, $error:expr $(,)?) => {
#[cfg(debug_assertions)]
$crate::assert_eq_float!($left, $right, $error);
};
($left:expr, $right:expr, $error:expr; $($arg:tt)+) => {
#[cfg(debug_assertions)]
$crate::assert_eq_float!($left, $right, $error; $($arg)+);
};
}