#![allow(unused_macros, unused_imports)]
pub const F64_PREC: f64 = 0.00000000000000011102230246251565;
pub const DEFAULT_F64_ACC: f64 = 0.0000000000000011102230246251565;
pub const DEFAULT_RELATIVE_ACC: f64 = 1e-14;
pub const DEFAULT_EPS: f64 = 1e-9;
pub const DEFAULT_ULPS: u32 = 5;
#[deprecated(since = "0.19.0", note = "Use abs_diff_eq! macro instead")]
pub fn almost_eq(a: f64, b: f64, acc: f64) -> bool {
use approx::AbsDiffEq;
if a.is_infinite() && b.is_infinite() {
return a == b;
}
a.abs_diff_eq(&b, acc)
}
pub(crate) fn convergence(x: &mut f64, x_new: f64) -> bool {
let res = relative_eq!(*x, x_new);
*x = x_new;
res
}
macro_rules! redefine_one_opt_approx_macro {
(
$approx_macro:ident,
{ epsilon: $default_eps:expr }
) => {
macro_rules! $approx_macro {
($a:expr, $b:expr, epsilon = $user_eps:expr) => {
approx::$approx_macro!($a, $b, epsilon = $user_eps)
};
($a:expr, $b:expr) => {
approx::$approx_macro!($a, $b, epsilon = $default_eps)
};
}
};
}
macro_rules! redefine_two_opt_approx_macro {
(
$approx_macro:ident,
{ epsilon: $default_eps:expr, $second_key:ident: $default_second:expr }
) => {
macro_rules! $approx_macro {
($a:expr, $b:expr, epsilon = $user_eps:expr, $second_key = $user_second:expr) => {
approx::$approx_macro!($a, $b, epsilon = $user_eps, $second_key = $user_second)
};
($a:expr, $b:expr, epsilon = $user_eps:expr) => {
approx::$approx_macro!($a, $b, epsilon = $user_eps, $second_key = $default_second)
};
($a:expr, $b:expr, $second_key = $user_second:expr) => {
approx::$approx_macro!($a, $b, epsilon = $default_eps, $second_key = $user_second)
};
($a:expr, $b:expr) => {
approx::$approx_macro!(
$a,
$b,
epsilon = $default_eps,
$second_key = $default_second
)
};
}
};
}
mod macros {
pub(crate) use redefine_one_opt_approx_macro;
pub(crate) use redefine_two_opt_approx_macro;
redefine_one_opt_approx_macro!(
abs_diff_eq,
{ epsilon: crate::prec::DEFAULT_EPS }
);
redefine_two_opt_approx_macro!(
relative_eq,
{ epsilon: crate::prec::DEFAULT_EPS, max_relative: crate::prec::DEFAULT_RELATIVE_ACC }
);
redefine_two_opt_approx_macro!(
ulps_eq,
{ epsilon: crate::prec::DEFAULT_EPS, max_ulps: crate::prec::DEFAULT_ULPS }
);
pub(crate) use abs_diff_eq;
pub(crate) use relative_eq;
pub(crate) use ulps_eq;
redefine_one_opt_approx_macro!(
assert_abs_diff_eq,
{ epsilon: crate::prec::DEFAULT_EPS }
);
redefine_two_opt_approx_macro!(
assert_relative_eq,
{ epsilon: crate::prec::DEFAULT_EPS, max_relative: crate::prec::DEFAULT_RELATIVE_ACC }
);
redefine_two_opt_approx_macro!(
assert_ulps_eq,
{ epsilon: crate::prec::DEFAULT_EPS, max_ulps: crate::prec::DEFAULT_ULPS }
);
pub(crate) use assert_abs_diff_eq;
pub(crate) use assert_relative_eq;
pub(crate) use assert_ulps_eq;
#[deprecated(since = "0.19.0", note = "Use assert_abs_diff_eq! macro instead")]
macro_rules! assert_almost_eq {
($a:expr, $b:expr, $eps:expr $(,)?) => {
approx::assert_abs_diff_eq!($a, $b, epsilon = $eps)
};
}
}
pub(crate) use macros::*;