Learning/SICP/exercise_1_7.janet
2025-03-30 15:33:16 +02:00

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)