[Python-ideas] Float range class
Chris Barker
chris.barker at noaa.gov
Thu Jan 8 17:31:43 CET 2015
On Thu, Jan 8, 2015 at 8:01 AM, Todd <toddrjen at gmail.com> wrote:
> Currently, the range class is limited to integers. However, in many
> applications, especially science and mathematics, ranges of float values
> are the norm.
>
almost -- see below.
> So it would be nice to have a float equivalent of the existing range
> class.
>
+1
> The second approach is to create a new class that handles floating-point
> ranges
>
I think this is the way to go, but not for the same reasons you gave.
from numpy experience: numpy provides an arange() ("array range", so names
back in the days of import *) with integer inputs is is essentially the
same as the py2 range() function -- i.e. creates a 1-d numpy array of
integers using start, stop, step.
Called with floating point arguments, it does much the same thing, but with
floats, and, of course, start, stop and step need not be integers -- but
here's the rub:
it does this in the naive way: starting with start, continuing to add
step, until the value is >= stop, at which point it terminates without
including that last value. This is fine and dandy for integers, but is a
mess with floats, due to rounding and binary storage under the hood (i.e
floats can not precisely represent common base-10 steps). This is
particularly a problem when you ant a particular end point to be included,
you then need to increase stop to a bit more than you want, so as to make
sure it gets included, but then you can accidentally get one too many.
This is almost never what people really want, though it does work as
expected most of the time -- that most of the time is the catch -- future
bugs lurking.
So: the accepted practice in numpy (and often espoused to newbies on the
mailing list) is to not use arange() for floats. Instead, the "linspace()"
function is recommended. This function returns evenly spaced numbers over a
specified interval, guaranteeing that you get the start an end points you
want included. It has optional arguments that let you define the spacing in
various ways, but the key is that the algorithms are designed to give the
user what is expected, regardless of floating point nuance.
Anyway, if such an object were to be added to the pyton standard libary, it
should be more like the numpy linspace(), rather than range.
-Chris
linspace docstring::
---------------------------
Return evenly spaced numbers over a specified interval.
Returns `num` evenly spaced samples, calculated over the
interval [`start`, `stop` ].
The endpoint of the interval can optionally be excluded.
Parameters
----------
start : scalar
The starting value of the sequence.
stop : scalar
The end value of the sequence, unless `endpoint` is set to False.
In that case, the sequence consists of all but the last of ``num + 1``
evenly spaced samples, so that `stop` is excluded. Note that the step
size changes when `endpoint` is False.
num : int, optional
Number of samples to generate. Default is 50.
endpoint : bool, optional
If True, `stop` is the last sample. Otherwise, it is not included.
Default is True.
retstep : bool, optional
If True, return (`samples`, `step`), where `step` is the spacing
between samples.
dtype : dtype
The type of the output array. If `dtype` is not given, infer the data
type from the other input arguments.
.. versionadded:: 1.9.0
Returns
-------
samples : ndarray
There are `num` equally spaced samples in the closed interval
``[start, stop]`` or the half-open interval ``[start, stop)``
(depending on whether `endpoint` is True or False).
step : float (only if `retstep` is True)
Size of spacing between samples.
> (perhaps called "frange") and/or a new class that handles duck-typed
> ranges (perhaps called "drange"). However, there isn't really a good place
> right now to put these as far as I can see.
>
>
> The third approach is to create a new module for various range classes.
> For example there could be a float range, a datetime range, a decimal
> range, a duck-typed range, an abstract base class for making new range
> classes, etc. However, this is a lot more work (although it wouldn't need
> to all be done at one time).
>
>
> _______________________________________________
> 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/20150108/ca1ed572/attachment-0001.html>
More information about the Python-ideas
mailing list