Python bug??? Or just a stupid question?

Please support our Python advertiser: Programming Forums - DaniWeb Sister Site
Thread Solved

Join Date: Oct 2007
Posts: 2
Reputation: tesak is an unknown quantity at this point 
Solved Threads: 0
tesak tesak is offline Offline
Newbie Poster

Python bug??? Or just a stupid question?

 
0
  #1
Oct 5th, 2007
Hello,
I am a newbie in Python and maybe this is a stupid question, but when I run this code I receive a very strange output.
  1. status = 0
  2. for i in range(10):
  3. status = status + 0.1
  4.  
  5. if status == 0.1:
  6. print status
  7. elif status == 0.2:
  8. print status
  9. elif status == 0.3:
  10. status
  11. elif status == 0.4:
  12. print status
  13. elif status == 0.5:
  14. print status
  15. elif status == 0.6:
  16. print status
  17. elif status == 0.7:
  18. print status
  19. elif status == 0.8:
  20. print status
  21. elif status == 0.9:
  22. print status
  23. elif status == 1.0:
  24. print status
At first I supposed that I will receive something like this:
>>>
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
>>>

But finally I was really surprised. Output looks like this:
>>>
0.1
0.2
0.4
0.5
0.6
0.7
>>>

Could somebody tells me what I am doing wrong?
Reply With Quote Quick reply to this message  
Join Date: Oct 2004
Posts: 4,075
Reputation: vegaseat is just really nice vegaseat is just really nice vegaseat is just really nice vegaseat is just really nice vegaseat is just really nice 
Solved Threads: 939
Moderator
vegaseat's Avatar
vegaseat vegaseat is offline Offline
DaniWeb's Hypocrite

Re: Python bug??? Or just a stupid question?

 
0
  #2
Oct 5th, 2007
This happens with many computer languages. You are trying to compare floating point values directly. Your 0.8 might be more like 0.799999999999999 and the compare flunks!

You can make this work by giving it a range you can compare within ...
  1. if 0.79999 < status < 0.80001:
  2. ... do something`
Last edited by vegaseat; Oct 5th, 2007 at 10:22 pm.
May 'the Google' be with you!
Reply With Quote Quick reply to this message  
Join Date: Dec 2006
Posts: 1,045
Reputation: woooee is a jewel in the rough woooee is a jewel in the rough woooee is a jewel in the rough 
Solved Threads: 294
woooee woooee is offline Offline
Veteran Poster

Re: Python bug??? Or just a stupid question?

 
0
  #3
Oct 5th, 2007
Look at the line following
elif status == 0.3:
And why do you have if/elif? Why not just print the value?
Reply With Quote Quick reply to this message  
Join Date: Oct 2007
Posts: 2
Reputation: tesak is an unknown quantity at this point 
Solved Threads: 0
tesak tesak is offline Offline
Newbie Poster

Re: Python bug??? Or just a stupid question?

 
0
  #4
Oct 6th, 2007
Thanks for an answer. It was just an example which really surprise me. But is there a way how to compare two float numbers without unpredictable results?
Reply With Quote Quick reply to this message  
Join Date: Jul 2006
Posts: 608
Reputation: jrcagle is on a distinguished road 
Solved Threads: 150
jrcagle jrcagle is offline Offline
Practically a Master Poster

Re: Python bug??? Or just a stupid question?

 
0
  #5
Oct 6th, 2007
Well, there are actually three issues in the code:

(1) is a matter of efficiency, which woooee already raised.

  1. status = 0
  2. for i in range(10):
  3. status = status + 0.1
  4. print status

does what you wanted to do, and is cleaner to read. One payoff of this approach is that...

(2) ...in your original code, you didn't get 0.3 in the output because you left out the print statement. The lines

  1. elif status == 0.3:
  2. status

have the effect of evaluating, but not printing, status. And then throwing away the result, because you aren't doing anything with it.

(3) Finally, comparing floating points is a common source of bugs. Even if we worked with BCD, so that we didn't have to work about base-2 to base-10 errors, still and all, our decimal approximations would still lead to imprecision. For example, the test π == 3.14159265358979 is False.

Vega gives a very good approach to this by selecting a range. My own approach is to define a function that is in my code base:

  1. def fuzzyequals(a,b,epsilon = 0.0001):
  2. return abs(a-b) < epsilon

This function returns True if a is within the "halo" of b; that is, if b-epsilon < a < b+epsilon.

You can then use it like this:

  1. ...
  2. if fuzzyequals(status,0.2): # or fuzzyequals(status, 0.2, 0.01)
  3. print status
  4. ...


Hope that helps,
Jeff
Reply With Quote Quick reply to this message  
Reply

This thread has been marked solved.
Perhaps start a new thread instead?
Message:


Thread Tools Search this Thread



About Us | Contact Us | Advertise | DaniWeb | Acceptable Use Policy | RSS Feed

©2003 - 2009 DaniWeb® LLC