[Python-ideas] PEP 485: A Function for testing approximate equality
Chris Barker
chris.barker at noaa.gov
Fri Feb 6 02:12:32 CET 2015
On Thu, Feb 5, 2015 at 4:44 PM, Steven D'Aprano <steve at pearwood.info> wrote:
> > 0.0 < rel_tol < 1.0)
>
> I can just about see the point in restricting rel_tol to the closed
> interval 0...1, but not the open interval. Mathematically, setting the
> tolerance to 0
> should just degrade gracefully to exact equality,
sure -- no harm done there.
and a tolerance of
> 1 is nothing special at all.
>
well, I ended up putting that in because it turns out with the "weak" test,
then anything compares as "close" to zero:
tol>=1.0
a = anything
b = 0.0
min( abs(a), abs(b) ) = 0.0
abs(a-b) = a
tol * a >= a
abs(a-b) <= tol * a
Granted, that's actually the best argument yet for using the strong test --
which I am suggesting, though I haven't thought out what that will do in
the case of large tolerances.
> Values larger than 1 aren't often useful, but there really is no reason
> to exclude tolerances larger than 1. "Give or take 300%" (ie.
> rel_tol=3.0) is a pretty big tolerance, but it is well-defined: a
> difference of 299% is "close enough", 301% is "too far".
>
yes it is, but then the whole weak vs string vs asymmetric test becomes
important. From my math the "delta" between the weak and strong tests goes
with tolerance**2 * max(a,b). So if the tolerance is >=1, then it makes a
big difference which test you choose. IN fact:
Is a within 300% of b makes sense, but "are a and b within 300% of
each-other" is poorly defined.
The goal of this is to provide an easy way for users to test if two values
are close - not to provide a general purpose relative difference function.
and keeping the scope small keeps things cleaner.
You might argue that if you want exact equality, you shouldn't use a
> tolerance at all but just use == instead. But consider a case where
> you might be trying calculations repeatedly and decreasing the tolerance
> until it fails:
>
sure -- then might as well include 0.0
> Negative error tolerances, on the other hand, do seem to be meaningless
> and should be prevented.
you could just take the abs(rel_tol), but really? what's the point?
> I don't see why a tolerance over 1 should behave any more oddly with
> zero than a tolerance under 1.
>
see above.
> And as for "close", some people would argue that rel_tol=0.5 is "hardly
> close". Sometimes you might accept anything within an order of magnitude
> the expected value: anything up to 10*x is "close enough". Or 20 times.
> Who knows?
>
with some more thought, we may be able to let rel_tol be anything > 0.0
with the string test. I"ll have to investigate more if folks think this is
important.
> (E.g. "guess the number of grains of sand on this beach".) Any upper
> limit you put in is completely arbitrary,
somehow one doesn't feel arbitrary to me -- numbers aren't close if the
difference between them is larger than the largest of the numbers -- not
arbitrary, maybe unneccesary , but not arbirtrary
> and this function shouldn't be
> in the business of telling people how much error they are allowed to
> tolerate. It's easy for people to put in their own restrictions, but
> hard for them to work around yours.
>
>
> > if a and/or b are inf or nan, it follows IEE754 (which mostly "just
> works"
> > with no special casing in the code.
>
> That is very nice.
>
>
>
> --
> Steve
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
--
Christopher Barker, Ph.D.
Oceanographer
Emergency Response Division
NOAA/NOS/OR&R (206) 526-6959 voice
7600 Sand Point Way NE (206) 526-6329 fax
Seattle, WA 98115 (206) 526-6317 main reception
Chris.Barker at noaa.gov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20150205/b64301d8/attachment-0001.html>
More information about the Python-ideas
mailing list