Performs an approximate comparison of two floating point values x and y.
Returns true if the absolute difference between them is less or equal than
max(|x|, |y|) * tolerance, where tolerance is a positive number greater
than zero.
The tolerance parameter is the relative tolerance used when determining if
the two numbers are close enough; a good value for this parameter is usually
sqrt(floatEps(T)), meaning that the two numbers are considered equal if at
least half of the digits are equal.
Note that for comparisons of small numbers around zero this function won't
give meaningful results, use approxEqAbs instead.
NaN values are never considered equal to any value.
pub fn approxEqRel(comptime T: type, x: T, y: T, tolerance: T) bool
pub fn approxEqRel(comptime T: type, x: T, y: T, tolerance: T) bool {
assert(@typeInfo(T) == .float or @typeInfo(T) == .comptime_float);
assert(tolerance > 0);
// Fast path for equal values (and signed zeros and infinites).
if (x == y)
return true;
if (isNan(x) or isNan(y))
return false;
return @abs(x - y) <= @max(@abs(x), @abs(y)) * tolerance;
}