(defvar *debug* t) (defun my-abs (x) (if (< x 0) (- 0 x) x)) (defun my-try-sqrt-guess (g x &optional (last nil)) (let* ( (x/g (float (/ x g))) (avg (float (/ (+ g x/g) 2))) (result (- x (* avg avg))) ) (if *debug* (progn (fastcgi:out "(calc X: " x ", G: " g ", X/G: " x/g ", Avg: " avg ", Result: " result ")" #\newline)) nil) (if (or (and (not (eq last nil)) (equal last result)) (< (my-abs result) 0.000001)) avg (my-try-sqrt-guess avg x result)) )) (defun my-sqrt (x) (my-try-sqrt-guess 1 x)) (fastcgi:out "Content-type: text/plain" #\newline #\newline) (let ((x (if (not (equal "" (fastcgi:getenv "QUERY_STRING"))) (parse-integer (fastcgi:getenv "QUERY_STRING") :radix 10) 2))) (fastcgi:out "Note: Will accept a query string parameter being a number to sqrt e.g. http://lisptests.phillipstreet.com/demo_sqrt.lisp?100" #\newline "System Sqrt of " x " is " (sqrt x) #\newline) (let ((root (my-sqrt x))) (fastcgi:out "My Sqrt of " x " is " (if (= (setf a (round root)) (float root)) (setf a (round root)) (float root)) #\newline)))