Я столкнулся с неожиданным исключением NullPointerException при реализации начального кода SICP в Clojure. В частности, я хочу реализовать итеративную процедуру извлечения квадратного корня из раздела 1.1.7.
Вот код:
(defn square [x] (* x x))
(defn abs [x]
(cond
(< x 0) (- x)
:else x))
(defn average [x y]
(/ (+ x y) 2))
(defn sqrt
([x] (sqrt 1.0 x))
([guess x]
(letfn [(good-enough? [guess]
(< (abs (- (square guess) x)) 0.001))
(improve [guess]
(average guess (/ x guess)))]
(if (good-enough? guess)
guess
(recur (improve guess) x)))))
Это отлично работает для достаточно малых значений, например (квадрат 16)
. Я получаю ошибку NullPointerException clojure.lang.Numbers.lt (Numbers.java:3693)
для любых входных данных, превышающих приблизительно (квадрат 2718)
.
Есть идеи?
Обновить всю трассировку (предыдущая - это все, что я получил в ответе):
Исключение в потоке "main" java.lang.NullPointerException на clojure.lang .Numbers.lt (Numbers.java:3693) в sicp_in_clojure.chapter_one $ sqrt $ good_enough_QMARK ___ 14.invoke (chapter_one.clj: 40) в sicp_in_clojure.chapter_one $ sqrt.invokej (chapter_one : 43) в sicp_in_clojure.chapter_one $ sqrt.invoke (chapter_one.clj: 37) в sicp_in_clojure.chapter_one $ eval19.invoke (chapter_one.clj: 48) в clojure .lang.Compiler.eval (Compiler.java:6465) в clojure.lang.Compiler.load (Compiler.java:6902) в clojure.lang.Compiler.loadFile (Compiler.java : 6863) в clojure.main $ load_script.invoke (main.clj: 282) в clojure.main $ script_opt.invoke (main.clj: 342) в clojure .main $ main.doInvoke (main.clj: 426) в clojure.lang.RestFn.invoke (RestFn.java:408) в clojure.lang.Var.invoke (Var.java : 401) на clojure.lang.AFn.applyToHelper (AFn.java:161) в clojure.lang.Var.applyTo (Var.java:518) в clojure.main.main (main.java:37)