[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

float equality

guille lists

10/27/2008 4:50:00 PM

Hi,

sorry if this is a very naive question (I'm new to ruby), but I
haven't found an explication yet. When comparing to floats in ruby I
came across this:

>> a = 0.1
=> 0.1
>> b = 1 - 0.9
=> 0.1
>> a == b
=> false
>> a > b
=> true
>> a < b
=> false
>> a <=> b
=> 1

I'm a bit lost here, shouldn't (0.1) and (1 - 0.9) be equals regarding
the == operator? I also found that for example 0.3 == (0.2 + 0.1)
returns false, etc.

guille

PD: I'm using ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]

16 Answers

VantheVan

9/15/2008 9:29:00 PM

0

Can someone please fix the title of this thread? I can't seem to
figure out how to do it.

Sal Video

9/15/2008 9:55:00 PM

0

Sorry I misspelled Pink. You can't fix a usenet thread title once it's gone
up. Onlu subsequent posts.


<VantheVan@gmail.com> wrote in message
news:9f44a85f-fd8b-4ef7-8396-e1562b724e83@k7g2000hsd.googlegroups.com...
> Can someone please fix the title of this thread? I can't seem to
> figure out how to do it.


The Weissman

9/15/2008 10:31:00 PM

0

"Sal Video" <svideo@access.com> wrote in message
news:3OAzk.357$D32.45@flpi146.ffdc.sbc.com...
> Sorry I misspelled Pink. You can't fix a usenet thread title once it's
> gone up. Onlu subsequent posts.
>
>
> <VantheVan@gmail.com> wrote in message
> news:9f44a85f-fd8b-4ef7-8396-e1562b724e83@k7g2000hsd.googlegroups.com...
>> Can someone please fix the title of this thread? I can't seem to
>> figure out how to do it.
>
>


Which one's Pick?

Todd Benson

10/27/2008 5:10:00 PM

0

On Mon, Oct 27, 2008 at 11:50 AM, guille lists <guilledist@gmail.com> wrote:
> Hi,
>
> sorry if this is a very naive question (I'm new to ruby), but I
> haven't found an explication yet. When comparing to floats in ruby I
> came across this:
>
>>> a = 0.1
> => 0.1
>>> b = 1 - 0.9
> => 0.1
>>> a == b
> => false
>>> a > b
> => true
>>> a < b
> => false
>>> a <=> b
> => 1
>
> I'm a bit lost here, shouldn't (0.1) and (1 - 0.9) be equals regarding
> the == operator? I also found that for example 0.3 == (0.2 + 0.1)
> returns false, etc.

Most people will point you to this:
http://en.wikipedia.org/wiki/Floating_point_...

There are several ways around it (using BigDecimal, Rational, Integers, etc.)

Totally off-topic, but has any one figured out exactly why 1/9
(0.111...) plus 8/9 (0.888...) is 1 instead of 0.999... :-)

Todd

The Higgs bozo

10/27/2008 5:10:00 PM

0

guille lists wrote:
> I'm a bit lost here, shouldn't (0.1) and (1 - 0.9) be equals regarding
> the == operator?

Nope. Floating-point is always inexact. This is a computer thing, not
a Ruby thing. The issue applies to all languages everywhere which use
floating point.

Here you can see the two values are slightly different:

irb(main):001:0> 1 - 0.9 == 0.1
=> false
irb(main):002:0> [1 - 0.9].pack("D")
=> "\230\231\231\231\231\231\271?"
irb(main):003:0> [0.1].pack("D")
=> "\232\231\231\231\231\231\271?"
--
Posted via http://www.ruby-....

Sebastian Hungerecker

10/27/2008 5:16:00 PM

0

guille lists wrote:
> I'm a bit lost here, shouldn't (0.1) and (1 - 0.9) be equals regarding
> the == operator?

No. The result of 1 - 0.9 using floating point math is not actually 0.1. In
irb it is displayed as 0.1, but that's only because Float#inspect rounds.
Using printf you can see that the result of 1-0.9 actually is 0.09999lots:
>> printf "%.30f", 1-0.9
0.099999999999999977795539507497
0.1 itself isn't actually 0.1 either - it's
0.100000000000000005551115123126...
Because of this you should not check two floats for equality (usually you want
to check for a delta or not use floats at all). This is so because of the
inherent inaccuracy of floating point maths. See this for more information:
http://docs.sun.com/source/806-3568/ncg_gol...

HTH,
Sebastian
--
Jabber: sepp2k@jabber.org
ICQ: 205544826

Matthew Moss

10/27/2008 5:52:00 PM

0

> Totally off-topic, but has any one figured out exactly why 1/9
> (0.111...) plus 8/9 (0.888...) is 1 instead of 0.999... :-)

Ummm... because 1/9 + 8/9 == (1 + 8)/9 == 9/9 == 1 ?

And... because 0.999... == 1?

x = 0.999...
10x = 9.999...
(10x - x) = 9.999... - 0.999...
9x = 9
x = 1




guille lists

10/27/2008 7:31:00 PM

0

Thanks a lot for the answers and references, and sorry for not having
check deeper on google
(http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby...).

So I guess that if one wants to work for example with float numbers in
the range [0,1], the best way to do it is by normalising from an
integer interval depending on the precision you want, say [0,100] for
two decimal digits precision, and so on. Is there any other better
approach? Does the use of BigDecimal impose a severe penalty on performance?


guille

The Higgs bozo

10/27/2008 7:48:00 PM

0

Matthew Moss wrote:
>> Totally off-topic, but has any one figured out exactly why 1/9
>> (0.111...) plus 8/9 (0.888...) is 1 instead of 0.999... :-)
>
> Ummm... because 1/9 + 8/9 == (1 + 8)/9 == 9/9 == 1 ?
>
> And... because 0.999... == 1?
>
> x = 0.999...
> 10x = 9.999...
> (10x - x) = 9.999... - 0.999...
> 9x = 9
> x = 1

While your answer is correct, you cannot subtract infinities as shown
in your proof. Look at this:

x == 1 - 1 + 1 - 1 + 1 - 1 + 1 - ...
x == 1 - 1 + 1 - 1 + 1 - 1 + ...
----------------------------------------
2x == 1 + 0 + 0 + 0 + 0 + 0 + 0 + ...
x == 0.5

Does x == 0.5? No, because x was never a number in the first place
because the given series does not converge. Your proof appears to
work because you've already assumed 0.99999... converges, but that is
what you are trying to prove.

P.S. Euler thought the answer was x == 0.5.

--
Posted via http://www.ruby-....

Tim Pease

10/27/2008 8:11:00 PM

0

On Mon, Oct 27, 2008 at 11:09 AM, Todd Benson <caduceass@gmail.com> wrote:
>
> Totally off-topic, but has any one figured out exactly why 1/9
> (0.111...) plus 8/9 (0.888...) is 1 instead of 0.999... :-)
>

I figured it out once, but I can't remember precisely how it worked.

TwP