From 4544be141e411e9e746bbcd29b7b5e776d983e67 Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Mon, 29 Jul 2019 10:05:28 +1200 Subject: [PATCH] Fix issue #20 with saturating_abs macros [to use std fns once stablized] --- src/eq.rs | 8 ++++++-- src/macros.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/eq.rs b/src/eq.rs index 6208295..2a6fea1 100644 --- a/src/eq.rs +++ b/src/eq.rs @@ -99,7 +99,7 @@ impl ApproxEq for f32 { { // Perform ulps comparion last let diff: i32 = self.ulps(&other); - diff.abs() <= margin.ulps + saturating_abs_i32!(diff) <= margin.ulps } } } @@ -227,7 +227,7 @@ impl ApproxEq for f64 { { // Perform ulps comparion last let diff: i64 = self.ulps(&other); - diff.abs() <= margin.ulps + saturating_abs_i64!(diff) <= margin.ulps } } } @@ -277,3 +277,7 @@ fn f64_approx_eq_test6() { println!("Ulps Difference: {}",x.ulps(&y)); assert!(x.approx_eq(y, (0.0, 3)) == true); } +#[test] +fn f64_code_triggering_issue_20() { + assert_eq!((-25.0f64).approx_eq(25.0, (0.00390625, 1)), false); +} diff --git a/src/macros.rs b/src/macros.rs index c0101fd..7eeaa30 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -20,6 +20,32 @@ macro_rules! approx_eq { }; } +// Until saturating_abs() comes out of nightly, we have to code it ourselves. +macro_rules! saturating_abs_i32 { + ($val:expr) => { + if $val.is_negative() { + match $val.checked_neg() { + Some(v) => v, + None => std::i32::MAX + } + } else { + $val + } + }; +} +macro_rules! saturating_abs_i64 { + ($val:expr) => { + if $val.is_negative() { + match $val.checked_neg() { + Some(v) => v, + None => std::i64::MAX + } + } else { + $val + } + }; +} + #[test] fn test_macro() { let a: f32 = 0.15 + 0.15 + 0.15;