(defn square [x] (* x x)) (defn good-enough2? [previous current acc] (>= (* current acc) (math/abs (- current previous)))) (defn good-enough? [guess x acc] (< (math/abs (- (square guess) x)) acc)) (defn average [x y] (/ (+ x y) 2)) (defn improve [guess x] (average guess (/ x guess))) (defn sqrt-iter [guess x acc] (if (good-enough? guess x acc) guess (sqrt-iter (improve guess x) x acc))) (defn sqrt-iter2 [prev guess x acc] (if (good-enough2? prev guess acc) guess (sqrt-iter2 guess (improve guess x) x acc))) (defn sqrt-iter-max [guess x i acc] (if (= i 0) -1 (if (good-enough? guess x acc) guess (sqrt-iter-max (improve guess x) x (- i 1) acc)))) (defn sqrt [x acc] (sqrt-iter 1.0 x acc)) (defn sqrt2 [x acc] (sqrt-iter2 0.0 x x acc)) (defn sqrt-max [x acc] (sqrt-iter-max 1.0 x 500 acc)) (defn relative-error [i f] (def measurement (sqrt2 i 0.0001)) (def measurement2 (sqrt2 i 0.00001)) (def measurement3 (sqrt2 i 0.000001)) (def actual (math/sqrt i)) (def rel-error (/ (- measurement actual) measurement)) (def rel-error2 (/ (- measurement2 actual) measurement2)) (def rel-error3 (/ (- measurement3 actual) measurement3)) (file/write f (string/format "%e,%e,%e,%e\n" i rel-error rel-error2 rel-error3))) (defn find-breakpoint [] (var found? false) (var base 1.0e12) (var minimum 1.0e-3) (var num 0.0) (while (not found?) (def test (+ num base)) (if (>= (sqrt-max test 0.001) 0) (set num (+ num base)) (do (set base (/ base 10.0)) (if (< base minimum) (set found? true))))) num) (print (find-breakpoint)) (def f (file/open "exercise_1_7_data.csv" :w)) (file/write f "i,0.001,0.0001,0.00001\n") (var total (* 2 50)) (var num 1e25) (while (> total 0) (relative-error num f) (set num (/ num (math/sqrt 10.0))) (set total (- total 1))) (file/close f)