Forum: Ruby ruby float calculations

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Alexandru T. (Guest)
on 2006-03-09 18:57
Could someone please explain to me why the following happens:

irb(main):001:0> 0.29 - 0.38 + 0.1
=> 0.00999999999999998
irb(main):002:0> 0.29 + (-0.38 + 0.1)
=> 0.00999999999999995
irb(main):003:0> 0.29 + 0.1 - 0.38
=> 0.01

How can I prevent something like this from happening, or at the very
least how can I work around such errors?

Many thanks in advance.
unknown (Guest)
on 2006-03-09 19:07
(Received via mailing list)
On Fri, 10 Mar 2006, Alexandru T. wrote:

> least how can I work around such errors?
>
> Many thanks in advance.

it is a hardware limitation, even a C program will do the same:

     harp:~ > cat a.c
     #include <stdlib.h>
     #include <stdio.h>

     main () {
       printf ("%32.32f\n", 0.29 - 0.38 + 0.1);
       printf ("%32.32f\n", 0.29 + (-0.38 + 0.1));
       printf ("%32.32f\n", 0.29 + 0.1 - 0.38);
     }


     harp:~ > gcc a.c && a.out
     0.00999999999999998112620858137234
     0.00999999999999995337063296574343
     0.01000000000000000888178419700125


with ruby, at least, you can use BigDecimal or the like - but with a
serious
speed penalty.  in short this is just the way computers work:

   http://en.wikipedia.org/wiki/Floating_point

hth.

-a
Cameron McBride (Guest)
on 2006-03-09 19:07
(Received via mailing list)
On 3/9/06, Alexandru T. <removed_email_address@domain.invalid> wrote:
> Could someone please explain to me why the following happens:
>
> irb(main):001:0> 0.29 - 0.38 + 0.1
> => 0.00999999999999998
> irb(main):002:0> 0.29 + (-0.38 + 0.1)
> => 0.00999999999999995
> irb(main):003:0> 0.29 + 0.1 - 0.38
> => 0.01

Check this out:

d1 = 0.29 - 0.38 + 0.1
d2 = 0.29 + (-0.38 + 0.1)
d3 = 0.29 + 0.1 - 0.38
p (d3 - d2)
p Float::EPSILON
(d3 - d2) < Float::EPSILON  #=> true

Computers do not store numbers indefinitely, so there is an "accuracy"
associated with floating point operations.   For more information,
check out:
  http://en.wikipedia.org/wiki/Floating_point

Cameron
Alexandru T. (Guest)
on 2006-03-09 19:41
>   http://en.wikipedia.org/wiki/Floating_point

Thanks for your answers. It's clear now. Expecially this link on the IBM
site made it very clear:
http://www2.hursley.ibm.com/decimal/decifaq1.html#inexact

My question now would be if there is an easy way to implement
floating-point decimal arithmetic in Ruby.
Alexandru T. (Guest)
on 2006-03-09 19:47
> My question now would be if there is an easy way to implement
> floating-point decimal arithmetic in Ruby.

Forget about this... it has already been answered... I should have been
more careful

>
> with ruby, at least, you can use BigDecimal or the like - but with a
> serious
> speed penalty.  in short this is just the way computers work:

Thanks again
This topic is locked and can not be replied to.