Float

John M McIntosh johnmci at smalltalkconsulting.com
Fri Nov 16 08:09:03 UTC 2007


Actually we can skip some of the complexity

(0.3 + 0.6 + 0.1) = 1.0  -> false

This is not a squeak problem, it's a problem with how floating point  
numbers are stored in binary floating point representation.
http://en.wikipedia.org/wiki/Floating_point_number


The 0.3 + 0.6 + 0.1 returns a number close to, but not quite 1.0

(0.3 + 0.6 + 0.1) hex '3FEFFFFFFFFFFFFF'
and
(0.3 + 0.5 + 0.2) hex '3FF0000000000000'
and
(1.0) hex  '3FF0000000000000

so when you compare  3FEFFFFFFFFFFFFF to 3FF0000000000000   that  
returns (truefully) false.

It's dangerous to compare floating point numbers, so consider instead.

(0.3 + 0.6 + 0.1) closeTo: (0.3 + 0.5 + 0.2) -> true

but you would need to look at the algorithm in closeTo: to decide if  
it's statistically meaningful to what you want.


On Nov 15, 2007, at 11:06 PM, Frederic Pluquet wrote:

> Hello,
>
> I found a bug in Squeak (3.0, #7067)... The following code returns  
> true:
>
> (#(0.3 0.5 0.2) inject: 0.0
> 					into: [:sum :proportion | sum + proportion]) = 1.0
>
>
> But this following code returns false !
> (#(0.3 0.6 0.1) inject: 0.0
> 					into: [:sum :proportion | sum + proportion]) = 1.0
>
>
> An idea ?
>
> Fréd
> -- 
> Frédéric Pluquet
> Université Libre de Bruxelles (ULB)
> Assistant
>

--
= 
= 
= 
========================================================================
John M. McIntosh <johnmci at smalltalkconsulting.com>
Corporate Smalltalk Consulting Ltd.  http://www.smalltalkconsulting.com
= 
= 
= 
========================================================================





More information about the Squeak-dev mailing list