Am 11.03.2011 04:23, schrieb Alex Hall:
Hi all,
I am trying to get a list of ordered pairs from the below function. In
my code, evaluate is more exciting, but the evaluate here will at
least let this run. The below runs fine, with one exception: somehow,
it is saying that -2+2.0 is 4.x, where x is a huge decimal involving
E-16 (in other words, a really tiny number). Does anyone have any idea
what is going on here?
You can find some great posts at a thread about decimal floating point
numbers some weeks ago for background reading. Or (and) look at this:
http://docs.python.org/tutorial/floatingpoint.html#floating-point-arithmetic-issues-and-limitations
Now my guess is:
i is calculated as a sum of floats of step 0.1. That means you have in
the base 2 representation an approximation of 0.1, not "exactly" 0.1,
but something like 0.10000000000000123123. When i reaches approximately
2.0, it is actually 2.00000000000000000342374 (or what ever). On the
other hand, e1 can be represented precisely if it's 2.0 in the base 2
representation. But the sum of e1 and i is actually your tiny number.
That's why 2.0 - 2.0 is exactly 0.0, but (20*0.1 - 2.0 is not).
To elaborate, you could add some lines to your code:
def getCoords(f, e1, e2, step=.1):
time=0
i=0
coords=[]
while time<=e2:
print "time="+str(e1)+"+"+str(i)+"="
print type(e1)
print type(i)
time=e1+i
time_2 = e1 + e2
print "%s, %.24f" % (time, time) # app 0.0
print "%s, %.24f" % (time_2, time_2) # exact 0.0
coords.append((time, evaluate(f, time)))
i=i+1*step
return coords
The reason why Python prints i as 2.0 in the first print statement is
probably due to some internal auto-rounding when using str(). See the
last paragraph of the link above. No idea, what's exactly going on under
the hood.
HTH,
Jan
def getCoords(f, e1, e2, step=.1):
#returns a list of (x,y) tuples from e1 to e2 at the given accuracy (step)
time=0
i=0
coords=[]
while time<=e2:
print "time="+str(e1)+"+"+str(i)+"="
time=e1+i
print time #watch this line when above is -2+2.0
coords.append((time, evaluate(f, time)))
i=i+1*step
return coords
def evaluate(x,y): return x*y
_______________________________________________
Tutor maillist - [email protected]
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor