
Jonathan Cast
On Friday 13 July 2007, Jon Fairbairn wrote:
Henning Thielemann
writes: On Thu, 12 Jul 2007, Jon Fairbairn wrote: Surely the first few digits can be computed?
That was my first thought, too.
We can't define
data Real = Real{ wholePart :: Integer, fractionPart :: [Int]}
because you can't yield e.g. sin pi as an infinite list of digits, but you can define
Well, no, but there are much better representations of reals than that.
data Real = Real{ exponent :: Int, mantissa :: Int -> [Int]}
That's somewhat better, but all that's required is that the infinite part should be lazy and give successively more information about the true value of the number.
where mantissa rounds the number when it's called. But unless these can be memoized fairly well, I would expect performance to be *quite* surprising to new users. . .
Hence my wish to use something with an efficient representation at the head. Here's another attempt:
data Real = R {easy:: Double, extra_exponent:: Integer, error_value:: ExactReal }
where extra_exponent is going to be zero for "ordinary size" numbers and error_value is some good exact real representation (as I said earlier in the thread, I'm not sufficiently familiar with the area to choose one. There's some discussion here http://www.dcs.ed.ac.uk/home/mhe/plume/node15.html), and the number represented is easy*base^extra_exponent+error_value. The hope would be that for low precision arithmetic the "easy" part would be enough, though it's possible that cases where some inspection of the error_value would be necessary would turn out to be common. -- Jón Fairbairn Jon.Fairbairn@cl.cam.ac.uk