Forum: Ruby Conditional Loop question

Posted by Ivan S. (ivan_s37)
on 2012-12-09 17:11
Attachment: Selecci__n_002.jpeg (11,1 KB)
Hi everybody,

can someone explain the behaviour of this simple loop that doesnt stop
in
1.13.

>> x =1.12
=> 1.12
>> loop do
?> x=x+0.01
>> break if (x==1.13 || x > 1.19)
>> puts x
>> end
1.13
1.14
1.15
1.16
1.17
1.18
=> nil


thanks.
Posted by Bartosz DziewoƄski (matmarex)
on 2012-12-09 17:49
(Received via mailing list)
This is because floating-point numbers are not exact.

irb(main):002:0> a = 1.12
=> 1.12
irb(main):003:0> b = 1.13
=> 1.13
irb(main):004:0> a + 0.01 == b
=> false
irb(main):005:0> a + 0.01
=> 1.1300000000000001

-- Matma Rex
Posted by Hassan Schroeder (Guest)
on 2012-12-09 17:54
(Received via mailing list)
On Sun, Dec 9, 2012 at 8:11 AM, Ivan S. <lists@ruby-forum.com> wrote:

> can someone explain the behaviour of this simple loop that doesnt stop
> in 1.13.
>
>>> x =1.12
> => 1.12
>>> loop do
> ?> x=x+0.01
>>> break if (x==1.13 || x > 1.19)

1.9.3 (main):0 > 1.13 == 1.13
=> true
1.9.3 (main):0 > 1.13 == (1.12 + 0.01)
=> false
1.9.3 (main):0 > 1.12 + 0.01
=> 1.1300000000000001
1.9.3 (main):0 > BigDecimal.new("1.13") == ( BigDecimal.new("1.12") +
BigDecimal("0.01") )
=> true

Floating Point strikes again :-)
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.