[Python-ideas] PEP 485: A Function for testing approximate equality

Steven D'Aprano steve at pearwood.info
Thu Jan 29 15:51:56 CET 2015


On Tue, Jan 27, 2015 at 12:57:03PM -0500, Alexander Belopolsky wrote:

> Just as a point of reference, APL and its derivatives use tolerant
> comparison in the default equal (=) operator.  The definition that they use
> for finite x and y is simply
> 
>   x = y <=> abs(x-y) <= tol * max(abs(x), abs(y))

That's essentially the same as Bruce Dawson recommends:

https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

and also the approx_equal function in test_statistics, except that also 
uses an absolute error if given.

Guido has asked what the use case for giving both relative and absolute 
error. I'll quote Dawson from the link above:

[quote]
The most generic answer to this quandary is to use a mixture of absolute 
and relative epsilons. If the two numbers being compared are extremely 
close – whatever that means – then treat them as equal, regardless of 
their relative values. This technique is necessary any time you are 
expecting an answer of zero due to subtraction. The value of the 
absolute epsilon should be based on the magnitude of the numbers being 
subtracted – it should be something like maxInput * FLT_EPSILON. 
Unfortunately this means that it is dependent on the algorithm and the 
inputs. Charming.

The ULPs based technique also breaks down near zero for the technical 
reasons discussed just below the definition of AlmostEqualUlps.

Doing a floating-point absolute epsilon check first, and then treating 
all other different-signed numbers as being non-equal is the simpler and 
safer thing to do. Here is some possible code for doing this, both for 
relative epsilon and for ULPs based comparison, with an absolute epsilon 
‘safety net’ to handle the near-zero case: [...]
[end quote]




-- 
Steven


More information about the Python-ideas mailing list