80 lines
1.9 KiB
Plaintext
80 lines
1.9 KiB
Plaintext
(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)
|