pub mod features;
#[inline]
pub fn approx_equal_relative(expected: f32, actual: f32, rel_tol: f32) -> bool {
let diff = (expected - actual).abs();
let abs_tol = 1e-3; let max_magnitude = expected.abs().max(actual.abs());
diff <= abs_tol + rel_tol * max_magnitude
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_approx_equal_relative_exact() {
assert!(approx_equal_relative(1.0, 1.0, 1e-3));
assert!(approx_equal_relative(0.0, 0.0, 1e-3));
}
#[test]
fn test_approx_equal_relative_small_diff() {
assert!(approx_equal_relative(1000.0, 1000.5, 1e-3));
assert!(approx_equal_relative(1000.0, 999.5, 1e-3));
}
#[test]
fn test_approx_equal_relative_large_diff() {
assert!(!approx_equal_relative(1000.0, 1010.0, 1e-3));
}
#[test]
fn test_approx_equal_relative_small_values() {
assert!(approx_equal_relative(0.001, 0.00105, 1e-3));
}
#[test]
fn test_approx_equal_relative_gradient_case() {
let left_plus_right = 697.85895_f32 + (-697.8577_f32);
let parent = 0.0012440681_f32;
assert!(approx_equal_relative(parent, left_plus_right, 1e-3));
}
}