<div dir="ltr">On Mon, Feb 6, 2017 at 5:42 AM, Juraj Sukop <span dir="ltr"><<a href="mailto:juraj.sukop@gmail.com" target="_blank">juraj.sukop@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Do you mean something like:<div><br></div><div>    isclose(f(x), 0.0, rel_tol, abs_tol)</div><div><br></div><div class="gmail_extra">If so, what should `rel_tol` and `abs_tol` be?<br></div></div></blockquote><br>isclose is mostly about "relative" closeness, so rel_tol is  more-or-less the number of decimal digits you want the same:<br><br>In [13]: isclose(1.11111111119, 1.11111111118, rel_tol=1e-11)<br>Out[13]: True<br><br></div><div class="gmail_quote">11 digits are the same<br></div><div class="gmail_quote"><br><br>In [14]: isclose(1.11111111119, 1.11111111118, rel_tol=1e-12)<br>Out[14]: False<br><br></div><div class="gmail_quote">12 aren't<br></div><div class="gmail_quote"><br></div><div class="gmail_quote">( I say more or less, because FP values are in binary and we tend to think in decimal)<br></div><div class="gmail_quote"><br>You might think you'd want to know if the two values are as close as possible given the FP representation -- which is what nextafter() would give you -- but it is very, very, rare that a computation accurately preserves ALL the digits -- and if it did, you could use the regular old ==, <, > checks.<br></div><div class="gmail_quote"><br></div><div class="gmail_quote">But NOTHING is relatively close to zero, so if you want to compare to zero you need an absolute tolerance -- what is close to zero in your application:<br><br></div><div class="gmail_quote"><div>In [19]: isclose(1e-100, 0.0, abs_tol = 1e-101)<br>Out[19]: False<br><br>In [20]: isclose(1e-100, 0.0, abs_tol = 1e-100)<br>Out[20]: True<br><br></div>Again, you probably don't want the smallest possible representable FP value -- cause if your computation was that perfect, why not just check for zero?<br><br></div><div class="gmail_quote">Figuring out what value makes sense in your use case requires either careful numerical analysis (that few of us are capable of!), or experimentation -- how small a value can you use and get the algorithm to converge?<br><br></div><div class="gmail_quote">-Chris<br><br></div><div class="gmail_quote"><div>See PEP 485 for more detail:<br><br><a href="https://www.python.org/dev/peps/pep-0485/">https://www.python.org/dev/peps/pep-0485/</a><br></div><div><br></div><div><br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Feb 6, 2017 at 2:16 PM, M.-A. Lemburg <span dir="ltr"><<a href="mailto:mal@egenix.com" target="_blank">mal@egenix.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="gmail-m_-3228630566319901140HOEnZb"><div class="gmail-m_-3228630566319901140h5">On 06.02.2017 13:22, Juraj Sukop wrote:<br>
> On Mon, Feb 6, 2017 at 11:29 AM, M.-A. Lemburg <<a href="mailto:mal@egenix.com" target="_blank">mal@egenix.com</a>> wrote:<br>
><br>
>><br>
>> Juraj: Could you provide some use cases, where such a function<br>
>> would help in Python applications ? (I can see use cases<br>
>> written in C, but due to the low level, find it hard to<br>
>> believe that people would use this at the Python level)<br>
>><br>
><br>
> In my case, `nextafter` would be used to check if a number is close to<br>
> polynomial zero, e.g.:<br>
><br>
>     def f(x):<br>
>         return 2.0*x**3 - 3.0*x**2 + 5.0*x - 7.0<br>
><br>
>     # x = 1.4455284586795218<br>
>     x = 1.445528458679522<br>
>     # x = 1.4455284586795223<br>
>     # x = 1.4455284586795225<br>
><br>
>     left = nextafter(x, -float('inf'))<br>
>     right = nextafter(x, float('inf'))<br>
><br>
>     print((f(left) < 0.0) != (f(x) < 0.0) or (f(x) < 0.0) != (f(right) <<br>
> 0.0))<br>
<br>
</div></div>Isn't this something you can do with math.isclose() ?<br>
<br>
This would even give you a predefined error range,<br>
not a dynamic one.<br>
<div class="gmail-m_-3228630566319901140HOEnZb"><div class="gmail-m_-3228630566319901140h5"><br>
--<br>
Marc-Andre Lemburg<br>
eGenix.com<br>
<br>
Professional Python Services directly from the Experts (#1, Feb 06 2017)<br>
>>> Python Projects, Coaching and Consulting ...  <a href="http://www.egenix.com/" rel="noreferrer" target="_blank">http://www.egenix.com/</a><br>
>>> Python Database Interfaces ...           <a href="http://products.egenix.com/" rel="noreferrer" target="_blank">http://products.egenix.com/</a><br>
>>> Plone/Zope Database Interfaces ...           <a href="http://zope.egenix.com/" rel="noreferrer" target="_blank">http://zope.egenix.com/</a><br>
______________________________<wbr>______________________________<wbr>____________<br>
<br>
::: We implement business ideas - efficiently in both time and costs :::<br>
<br>
   eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48<br>
    D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg<br>
           Registered at Amtsgericht Duesseldorf: HRB 46611<br>
               <a href="http://www.egenix.com/company/contact/" rel="noreferrer" target="_blank">http://www.egenix.com/<wbr>company/contact/</a><br>
                      <a href="http://www.malemburg.com/" rel="noreferrer" target="_blank">http://www.malemburg.com/</a><br>
<br>
</div></div></blockquote></div><br></div></div><div class="gmail-HOEnZb"><div class="gmail-h5">
</div></div><br>______________________________<wbr>_________________<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" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/<wbr>codeofconduct/</a><br></blockquote></div><br><br clear="all"><br>-- <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>