Spanning a Range Defined by Floats
Credit: Dinu C. Gherman, Paul M. Winkler
Problem
You need an arithmetic progression, just like
the built-in function range, but with float values
(range works only on integers).
Solution
Although this functionality is not available as a built-in, it’s not hard to code it with a loop:
def frange(start, end=None, inc=1.0):
"A range-like function that does accept float increments..."
if end == None:
end = start + 0.0 # Ensure a float value for 'end'
start = 0.0
assert inc # sanity check
L = []
while 1:
next = start + len(L) * inc
if inc > 0 and next >= end:
break
elif inc < 0 and next <= end:
break
L.append(next)
return LDiscussion
Sadly missing in the Python standard library, the function in this
recipe lets you use ranges, just as with the built-in function
range, but with float arguments.
Many theoretical restrictions apply, but this function is more useful in practice than in theory. People who work with floating-point numbers all the time have many war stories about billion-dollar projects that failed because someone did not take into consideration the strange things that modern hardware does when comparing floating-point numbers. But for pedestrian cases, simple approaches like this recipe generally work.
You can get a substantial speed boost by preallocating the list
instead of calling append repeatedly. This also allows you to get rid of the conditionals in the inner loop. For one element, this version is barely faster, but with more than 10 elements ...