infinite (fractional) precision

Ketil Z. Malde ketil@ii.uib.no
10 Oct 2002 11:56:43 +0200


Ashley Yakeley <ashley@semantic.org> writes:

> At 2002-10-10 01:29, Ketil Z. Malde wrote:
> 
> >I realize it's probably far from trivial, e.g. comparing two equal
> >numbers could easily not terminate, and memory exhaustion would
> >probably arise in many other cases.
> 
> I considered doing something very like this for real (computable) 
> numbers, but because I couldn't properly make the type an instance of Eq, 

instance Eq InfPoint where
        x (==) y == compareToPrecision epsilon x y
                where epsilon = unsafePerformIO ...

A bit (perhaps not just a bit either) ugly, but comparable to using a
fixed point, no?

> I left it. Actually it was worse than that. Suppose I'm adding two 
> numbers, both of which are actually 1, but I don't know that:
> 
>  1.000000000.... +
>  0.999999999....

Could it be represented as

        data InfPoint = IP Integer FractionalPart
        data FractionalPart = FP Word8 | Repeat FractionalPart 

Thus:

        1.00.. -> IP 1 (Repeat (FP 0))
        0.99.. -> IP 0 (Repeat (FP 9))

where the latter could be normalized to the former?

Okay, you still get the problem comparing 

        sqrt 2 == sqrt (sqrt 4)

But wait a second:

> The trouble is, as far as I know with a finite number of digits, the 
> answer might be

>  1.9999999999937425

> or it might be

> 2.0000000000013565

> ...so I can't actually generate any digits at all. 

But if you want to calcualte the sum for a finite number of digits, do
you really care if you calculate it as

        1.999..9
or      2.000..0
?

-kzm
-- 
If I haven't seen further, it is by standing in the footprints of giants