[newbie] problem making equally spaced value array with linspace
Peter Otten
__peter__ at web.de
Tue Dec 18 08:09:30 EST 2012
Jean Dubois wrote:
> I have trouble with the code beneath to make an array with equally
> spaced values
> When I enter 100e-6 as start value, 700e-6 as end value and 100e-6 I
> get the following result:
> [ 0.0001 0.00022 0.00034 0.00046 0.00058 0.0007 ]
> But I was hoping for:
> [ 0.0001 0.0002 0.0003 0.0004 0.0005 0.0006 0.0007]
> It works correctly for other values like 1,7,1 but not for 0.1,0.7,0.1
> then again for 0.01,0.07,0.01
>
> What I find strange is that for the 1st example "1+abs(float(endvalue)-
> float(startvalue))/float(incr)" gives 7.0 but int() of this value
> gives 6
> can someone provide help with this issue?
> thanks
> jean
>
> #!/usr/bin/python
> import math
> import numpy as np
> print "Enter start value as a float (e.g. 0.001) or in scientific
> notation (e.g. 1e-3): ",
> startvalue = raw_input()
> print "Enter end value: ",
> endvalue = raw_input()
> print "Enter step: ",
> incr = raw_input()
> #nom = number of measurements
> nom=int(1+abs(float(endvalue)-float(startvalue))/float(incr))
> array=np.linspace(float(startvalue), float(endvalue), float(nom))
> print "Array with current values: ",array
If you repeat the calculation of the number of intervals in the interpreter
you get
>>> 1 + abs(0.0007-0.0001)/0.0001
6.999999999999999
Many numbers cannot be represented exactly as float (that's the price you
have to pay for covering a wide range with just a few (8) bytes), and you
have introduced such a small error. The subsequent int() call will round
that float to the integer below it:
>>> int(_)
6
While applying round() would work here
>>> int(round(1 + abs(0.0007-0.0001)/0.0001))
7
there is no once-and-for-all solution to the underlying problem. E. g.
>>> x = 2.**53
>>> x == x + 1
True
More information about the Python-list
mailing list