[Python-ideas] Float range class
Andrew Barnert
abarnert at yahoo.com
Fri Jan 9 23:17:20 CET 2015
On Jan 9, 2015, at 13:22, Ethan Furman <ethan at stoneleaf.us> wrote:
> On 01/09/2015 12:58 PM, Andrew Barnert wrote:
>
>> arange is actually very easy to get right, but hard to _use_ properly. A half-open range of values from 0 to .9 by .3
>> is going to include a number just under 0.9 if properly implemented. However you slice it, .3*3<.9, .3+.3+.3<.9, etc.,
>> so that number belongs in the range.
>
> As a non-maths person (no degree, passingly familiar with algebra, light trigonometry, what little I remember from
> calculus) can you explain that to me? Why does a number slightly less than .9 /have/ to be in the results for a
> "properly implemented" frange?
>
> def frange(start, stop, step):
> count, remainder = divmod(stop - start, step)
> count = int(count)
> if remainder > 0.00000001:
> count += 1
> for i in range(count):
> yield start + i * step
Try it with step=1e-12.
This is equivalent on designing float.__eq__ as something like abs(self-other) < 0.00000001. At first glance it seems like that makes all floating point comparison problems go away, until you try it with small floats and suddenly 9e-12 - 1e-12 == 4e-12.
The right epsilon to use depends on the specific problem space, so it can't be hardcoded into a general-purpose function.
More information about the Python-ideas
mailing list