1. I reran the timing experiments:
        
        build a list of 1,000 random naturals in [0,10)
        run a loop 100 times 
        that computes the sqrt for the entire list for each iteration 

The rough results are: 

  -- untyped, exact rationals: ~10,000 msec 
  -- untyped, inexact numbers: ~200 msec
  -- typed, inexact numbers: ~90msec 

If you run typed, exact rationals you seem to get something a tad faster than 
10,000 but it's not worth writing home about. 

SO: a factor of 50 is due to inexact numbers and a factor of 2 is due to types. 
(A factor of 2 is a good one.)


2. The addition in lieu of the multiplication is consistently the fastest 
version of the three I mentioned last night: 

  (: the-sqrt : Real -> Real)
  (define (the-sqrt y)
    (let loop [(x (/ y 2.0))]
      (let [(error (- y (* x x)))]
        (if (< (abs error) epsilon) 
            x
            (loop (+ x (/ error (+ x x))))))))

Our compiler should probably implement reduction of strength optimizations 
based on this one experiment alone. The savings here are over 10%. 


3. As for my mistake: I had typed sqrt as Float -> Exact-Rational for reasons 
that escape me now. If you do so, 

  (: my-sqrt : Float -> Exact-Rational)
  (define (my-sqrt y)
    (let loop [(x (/ y 2))]
      (let [(error (- y (* x x)))]
        (if (< (abs error) epsilon) 
            x
            (loop (+ x (/ error 2 x)))))))

the type checker highlights x. In response I changed BOTH the 2 and the 
Exact-Rational and made the quickly forgotten mental note that I mentioned last 
night. 

-- Matthias



_________________________________________________
  For list-related administrative tasks:
  http://lists.racket-lang.org/listinfo/users

Reply via email to