# How to use a decimal range() step value?

Rather than using a decimal step directly, it's much safer to express this in terms of how many points you want. Otherwise, floating-point rounding error is likely to give you a wrong result.

You can use the linspace function from the NumPy library (which isn't part of the standard library but is relatively easy to obtain). `linspace`

takes a number of points to return, and also lets you specify whether or not to include the right endpoint:

`>>> np.linspace(0,1,11)array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])>>> np.linspace(0,1,10,endpoint=False)array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])`

If you really want to use a floating-point step value, you can, with `numpy.arange`

.

`>>> import numpy as np>>> np.arange(0.0, 1.0, 0.1)array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])`

Floating-point rounding error *will* cause problems, though. Here's a simple case where rounding error causes `arange`

to produce a length-4 array when it should only produce 3 numbers:

`>>> numpy.arange(1, 1.3, 0.1)array([1. , 1.1, 1.2, 1.3])`

Python's range() can only do integers, not floating point. In your specific case, you can use a list comprehension instead:

`[x * 0.1 for x in range(0, 10)]`

(Replace the call to range with that expression.)

For the more general case, you may want to write a custom function or generator.

Building on 'xrange([start], stop[, step])', you can define a generator that accepts and produces any type you choose (stick to types supporting `+`

and `<`

):

`>>> def drange(start, stop, step):... r = start... while r < stop:... yield r... r += step... >>> i0=drange(0.0, 1.0, 0.1)>>> ["%g" % x for x in i0]['0', '0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8', '0.9', '1']>>> `