Search code examples
pythonnumpyrangeprecision

numpy `arange` exceeds end value


I had expected numpy's arange(start, end) to produce values in the range [start, end]. The following example demonstrates that that's not always true (the final value is larger than end):

import numpy as np

start = 2e9
end = start + 321
step = 0.066833171999
x = np.arange(start, end, step=step)
print x[-1] > end  # Prints "True"
print x[-1] - end  # Prints 0.00013661384582519531

The error seems far too large to be caused by machine precision (but perhaps I'm thinking about it incorrectly). What's going on?

I'm using Numpy version 1.10.1.


Solution

  • From the arange docs:

    Array of evenly spaced values.

    For floating point arguments, the length of the result is ceil((stop - start)/step). Because of floating point overflow, this rule may result in the last element of out being greater than stop.

    Your step times the length of the array is larger than 321. linspace is more careful about end points.