[Python-ideas] math.nextafter
Chris Barker
chris.barker at noaa.gov
Thu Feb 23 23:01:50 EST 2017
On Mon, Feb 6, 2017 at 5:42 AM, Juraj Sukop <juraj.sukop at gmail.com> wrote:
> Do you mean something like:
>
> isclose(f(x), 0.0, rel_tol, abs_tol)
>
> If so, what should `rel_tol` and `abs_tol` be?
>
isclose is mostly about "relative" closeness, so rel_tol is more-or-less
the number of decimal digits you want the same:
In [13]: isclose(1.11111111119, 1.11111111118, rel_tol=1e-11)
Out[13]: True
11 digits are the same
In [14]: isclose(1.11111111119, 1.11111111118, rel_tol=1e-12)
Out[14]: False
12 aren't
( I say more or less, because FP values are in binary and we tend to think
in decimal)
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.
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:
In [19]: isclose(1e-100, 0.0, abs_tol = 1e-101)
Out[19]: False
In [20]: isclose(1e-100, 0.0, abs_tol = 1e-100)
Out[20]: True
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?
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?
-Chris
See PEP 485 for more detail:
https://www.python.org/dev/peps/pep-0485/
> On Mon, Feb 6, 2017 at 2:16 PM, M.-A. Lemburg <mal at egenix.com> wrote:
>
>> On 06.02.2017 13:22, Juraj Sukop wrote:
>> > On Mon, Feb 6, 2017 at 11:29 AM, M.-A. Lemburg <mal at egenix.com> wrote:
>> >
>> >>
>> >> Juraj: Could you provide some use cases, where such a function
>> >> would help in Python applications ? (I can see use cases
>> >> written in C, but due to the low level, find it hard to
>> >> believe that people would use this at the Python level)
>> >>
>> >
>> > In my case, `nextafter` would be used to check if a number is close to
>> > polynomial zero, e.g.:
>> >
>> > def f(x):
>> > return 2.0*x**3 - 3.0*x**2 + 5.0*x - 7.0
>> >
>> > # x = 1.4455284586795218
>> > x = 1.445528458679522
>> > # x = 1.4455284586795223
>> > # x = 1.4455284586795225
>> >
>> > left = nextafter(x, -float('inf'))
>> > right = nextafter(x, float('inf'))
>> >
>> > print((f(left) < 0.0) != (f(x) < 0.0) or (f(x) < 0.0) != (f(right) <
>> > 0.0))
>>
>> Isn't this something you can do with math.isclose() ?
>>
>> This would even give you a predefined error range,
>> not a dynamic one.
>>
>> --
>> Marc-Andre Lemburg
>> eGenix.com
>>
>> Professional Python Services directly from the Experts (#1, Feb 06 2017)
>> >>> Python Projects, Coaching and Consulting ... http://www.egenix.com/
>> >>> Python Database Interfaces ... http://products.egenix.com/
>> >>> Plone/Zope Database Interfaces ... http://zope.egenix.com/
>> ________________________________________________________________________
>>
>> ::: We implement business ideas - efficiently in both time and costs :::
>>
>> eGenix.com Software, Skills and Services GmbH Pastor-Loeh-Str.48
>> D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
>> Registered at Amtsgericht Duesseldorf: HRB 46611
>> http://www.egenix.com/company/contact/
>> http://www.malemburg.com/
>>
>>
>
> _______________________________________________
> 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/20170223/fb62dce6/attachment.html>
More information about the Python-ideas
mailing list