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
|