[Haskell-cafe] Problems with truncate big float values in Haskell

Albert Y. C. Lai trebla at vex.net
Fri Jan 6 01:35:02 UTC 2017


On 2017-01-05 02:30 PM, Albert Y. C. Lai wrote:
> On 2017-01-05 01:16 PM, Henson wrote:
>> I have one Rational number (3 + sqrt 5)
>
> Irrational Number.
>
>> let x = (truncate ((3 + sqrt 5) ^ 2000000)) `mod` 1000 and result is 216.
>
> You need to firstly read http://floating-point-gui.de/formats/fp/ , and
> secondly google for "goldberg floating point" and read "what every
> computer scientist should know about floating-point arithmetic".

And the conclusion at that point should be: A direct Double approach 
will not work. ("direct" means you don't do your own math first.) You 
will need to be either indirect (do your own math first) or forget Double.

In fact I would do both indirect and forget Double.

Let r = 3 + sqrt 5, s = 3 - sqrt 5. s is the evil twin of r.

Define (as in math, not code) h n = r^n + s^n for natural n.

(a) Prove: r and s are the roots of x^2 - 6x + 4 = 0.
   And so r^2 = 6r - 4, s^2 = 6s - 4.

   (How did I think up that equation? From (x - r)*(x - s).)

(b) Prove: h satisfies the following recurrence

   h 0 = 2
   h 1 = 6
   h n = 6 * h (n-1) - 4 * h (n-2)  for n>=2

   (Sketch: Part (a) will be useful.)

(c) Prove: floor(r^n) = h n - 1. (Sketch: 0 < s^n < 1, and the 
recurrence tells you that h n is a natural number.)

(d) Give and/or code up an algorithm to compute the last three decimal 
digits of floor(r^n); it should use only O(n) time, O(lg n) space, and 
integer/natural arithmetic. In fact, the lg n space is only for counting 
from 0 to n, the algorithm is constant-space otherwise (for mod-1000 
arithmetic).

   (Actually you could get it down to O(lg n) time too, but that's for 
another day.)

(e) Do a similar thing to floor((the gold ratio)^n).


How I came up with this idea: I recalled that the fibonacci numbers are 
related to (the golden ratio)^n (for example CLRS has a few lines on 
this). So I just had to adapt it to 3 + sqrt 5.

* * *

For a decade, I haven't had a good excuse to use my smug saying. So this 
is a good chance to say:

The language of computing is not C, Node.js, or Haskell. The language of 
computing is mathematics.



More information about the Haskell-Cafe mailing list