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.
···
--
Posted via http://www.ruby-forum.com/.
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:
Floating-point arithmetic - Wikipedia
hth.
-a
···
On Fri, 10 Mar 2006, Alexandru Toma 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
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.
--
knowledge is important, but the much more important is the use toward which it
is put. this depends on the heart and mind of the one who uses it.
- h.h. the 14th dali lama
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:
Floating-point arithmetic - Wikipedia
Cameron
···
On 3/9/06, Alexandru Toma <flash3001@yahoo.com> 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
Floating-point arithmetic - Wikipedia
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.
···
--
Posted via http://www.ruby-forum.com/\.
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
···
--
Posted via http://www.ruby-forum.com/\.