Hugs Humor
Ross Paterson
ross@soi.city.ac.uk
Sat, 5 Jul 2003 20:48:23 +0100
On Sat, Jul 05, 2003 at 08:24:32PM +0100, Jon Fairbairn wrote:
> On 2003-07-05 at 19:43+0200 Steffen Mazanek wrote:
> > a quit funny hugs session:
> >
> > Prelude> 0.5::Rational
> > 1 % 2
> > Prelude> 0.1::Rational
> > 13421773 % 134217728
> > Prelude> 13421773/134217728
> > 0.1
> >
> > I do not know how this fraction is calculated, but
> > it does not fit my expectations :-)
>
> Remember that internally arithmetic is binary, and that 0.1
> can't be expressed exactly as a floating point number. I
> think that's the explanation.
>
> > Ok, ok, it is no bug...
>
> No, I think it is a bug: 0.1 ought to be equivalent to
> fromRational (1%10), but Hugs isn't intended for numerical
> work. GHCi gets the right answer.
Yes, Hugs represents floating point literals in binary, and it's not
intended for the numeric work. But the CVS version already contains a
hack that usually converts these literals back to the right Rational:
Prelude> 0.1::Rational
1 % 10
Prelude> 0.0123456789::Rational
123456789 % 10000000000
Prelude> 2.2e-9::Rational
11 % 5000000000
The real fix would be to keep the literals as Rationals, but this would
be too expensive in the Hugs setting.