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