exactly
I changed my comparison to:

if abs(rate-desired_rate) > 0.01:

And now it works :D

thanks

2012/8/22 Radomir Dopieralski <[email protected]>

> On Wed, Aug 22, 2012 at 9:07 PM, Ricardo Franco <[email protected]>
> wrote:
> > Hi, this is more a question about python than pygame. Considering this
> code:
> >
> > #####################################################
> > rate = 1
> > desired_rate = 2
> >
> > while True:
> >     if rate != desired_rate:
> >         print rate, desired_rate, (rate != desired_rate)
> >         rate += 0.1 * (1 if desired_rate > rate else -1)
> >     # if
> > # while
> > #####################################################
> >
> > It should smoothly move rate from 1 until 2.
> > But the output is this:
> >
> > 1 2 True
> > 1.1 2 True
> > 1.2 2 True
> > 1.3 2 True
> > 1.4 2 True
> > 1.5 2 True
> > 1.6 2 True
> > 1.7 2 True
> > 1.8 2 True
> > 1.9 2 True
> > 2.0 2 True
> > 1.9 2 True
> > 2.0 2 True
> > 1.9 2 True
> > 2.0 2 True
> > 1.9 2 True
> > 2.0 2 True
> > 1.9 2 True
> > 2.0 2 True
> > ...
> >
> > Is python missing in comparison?
>
> One thing you need to understand about floating point numbers is that
> they are not exact -- they are the nearest values that can be
> represented in binary in the limited number of bytes (double
> precision, in case of python, AFAIR).
>
> Another thing to remember is that the decimal value 0.1 is a periodic
> fraction in binary -- it doesn't have a finite exact representation,
> just like 1/3 doesn't have one in decimal. That means that whenever
> you write 0.1, the computer really stores a value that is a little bit
> larger than that. You can try it in the python console:
>
>
> >>> '%f' % 0.1
> '0.100000'
> >>> '%.40f' % 0.1
> '0.1000000000000000055511151231257827021182'
> >>>
>
> Now, consider this:
>
> >>> '%.40f' % (1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 +
> 0.1)
> '2.0000000000000008881784197001252323389053'
>
> You can clearly see, that this is not equal 2.0.
>
> That's why when you are comparing floating point numbers, you always
> have to check if they are within some small error value from each
> other. How large that value is depends on your particular use case.
>
> If you really need to have *exact* results, at the expense of slower
> computation, use the Decimal type.
>
> I hope that helps,
>
> --
> Radomir Dopieralski
>



-- 
Ricardo Franco Andrade             @ricardokrieg

( Game | Desktop | Web ) Developer

email: [email protected]
contact: +55 (86) 9958 9725
             +55 (86) 9436 0830
twitter: twitter.com/ricardokrieg
facebooK: https://www.facebook.com/krieg.ricardo
github: https://github.com/ricardokrieg

Reply via email to