ashleygwilliams/assert_approx_eq

support relative tolerance as well as absolute difference?

Opened this issue · 2 comments

I've just started using your code and realised it doesn't have a concept of "relative difference", e.g:

let a = 1e10;
let b = a + a * std::f64::EPSILON;
assert_approx_eq!(a, b);

will fail, even though the values are as close as possible to each other while being distinct. the hex representations of the above are:

0x1.2a05f20000000p+33
0x1.2a05f20000001p+33

i.e. one bit different, which seems like something I'd consider "approximately equal".

other libraries do something equivalent to:

(a - b).abs() < a.abs().max(b.abs()) * rel_tol + abs_tol

where rel_tol and abs_tol are configurable like eps is in your code, with your code implicitly using 0 and 1e-6 at the moment. for comparison, Python variously uses values of 1e-9 and 0, 1e-5 and 1e-08, and 1e-7 and 0.

could put a patch together, but not sure if this something you want & how much to break the existing API

I'd be interested in this, too. I'm kind of a newbie Rustacean, but I wouldn't mind taking a stab at implementing or discussing this, either (mostly so I can learn something 😄).

@cglosser https://lib.rs/crates/approx provides a macro for this as well as looking somewhat more popular