<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Feb 5, 2015 at 4:44 PM, Steven D'Aprano <span dir="ltr"><<a href="mailto:steve@pearwood.info" target="_blank">steve@pearwood.info</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">> 0.0 < rel_tol < 1.0)<br>
<br>
</span>I can just about see the point in restricting rel_tol to the closed<br>
interval 0...1, but not the open interval. Mathematically, setting the tolerance to 0<br>
should just degrade gracefully to exact equality, </blockquote><div><br></div><div>sure -- no harm done there.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">and a tolerance of<br>
1 is nothing special at all.<br></blockquote><div><br></div><div>well, I ended up putting that in because it turns out with the "weak" test, then anything compares as "close" to zero:</div><div><br></div><div>tol>=1.0</div><div>a = anything</div><div>b = 0.0</div><div><br></div><div>min( abs(a), abs(b) ) = 0.0</div><div><br></div><div>abs(a-b) = a </div><div><br></div><div>tol * a >= a</div><div><br></div><div>abs(a-b) <= tol * a</div><div><br></div><div>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.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Values larger than 1 aren't often useful, but there really is no reason<br>
to exclude tolerances larger than 1. "Give or take 300%" (ie.<br>
rel_tol=3.0) is a pretty big tolerance, but it is well-defined: a<br>
difference of 299% is "close enough", 301% is "too far".<br></blockquote><div><br></div><div>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:</div><div><br></div><div>Is a within 300% of b makes sense, but "are a and b within 300% of each-other" is poorly defined.</div><div><br></div><div>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.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">You might argue that if you want exact equality, you shouldn't use a<br>
tolerance at all but just use == instead. But consider a case where<br>
you might be trying calculations repeatedly and decreasing the tolerance<br>
until it fails:<br></blockquote><div><br></div><div>sure -- then might as well include 0.0 </div><div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Negative error tolerances, on the other hand, do seem to be meaningless<br>
and should be prevented.</blockquote><div><br></div><div>you could just take the abs(rel_tol), but really?  what's the point?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I don't see why a tolerance over 1 should behave any more oddly with<br>
zero than a tolerance under 1.<br></blockquote><div><br></div><div>see above.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
And as for "close", some people would argue that rel_tol=0.5 is "hardly<br>
close". Sometimes you might accept anything within an order of magnitude<br>
the expected value: anything up to 10*x is "close enough". Or 20 times.<br>
Who knows?<br></blockquote><div><br></div><div>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.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
(E.g. "guess the number of grains of sand on this beach".) Any upper<br>
limit you put in is completely arbitrary,</blockquote><div><br></div><div>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</div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> and this function shouldn't be<br>
in the business of telling people how much error they are allowed to<br>
tolerate. It's easy for people to put in their own restrictions, but<br>
hard for them to work around yours.<br>
<span class=""><br>
<br>
> if a and/or b are inf or nan, it follows IEE754 (which mostly "just works"<br>
> with no special casing in the code.<br>
<br>
</span>That is very nice.<br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
<br>
--<br>
Steve<br>
</font></span><div class="HOEnZb"><div class="h5">_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" target="_blank">http://python.org/psf/codeofconduct/</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><br>Christopher Barker, Ph.D.<br>Oceanographer<br><br>Emergency Response Division<br>NOAA/NOS/OR&R            (206) 526-6959   voice<br>7600 Sand Point Way NE   (206) 526-6329   fax<br>Seattle, WA  98115       (206) 526-6317   main reception<br><br><a href="mailto:Chris.Barker@noaa.gov" target="_blank">Chris.Barker@noaa.gov</a></div>
</div></div>