# Exercise 1.7

The problem of the `good-enough?` procedure is that 0.001 is arbitrary small and is not optimal for small or big numbers.
For instance, `(sqrt 1.e-10)` return `0.03125000106562499`, which is obviously not even close to the exact `1e-5` solution. For big numbers, the program hangs on my system: `(sqrt 1e60)` never terminates. Below is an alternative code which introduces a new variable `old-guess` to keep tracking of the change during two iterations to find the approximation of any square root. Here a guess is considered good enough if the ratio between the old guess and the new guess is close enough to one.

``````(define (sqrt-iter old-guess guess x)
(if (good-enough? old-guess guess x) guess
(sqrt-iter guess (improve guess x) x)))

(define (improve guess x)
(average guess (/ x guess)))

(define (average x y)
(/ (+ x y) 2))

(define (good-enough? old-guess guess x)
(< (abs (- 1 (/ guess old-guess))) 0.001))

(define (sqrt x)
(sqrt-iter 0.1 1.0 x))``````

Now we can easily compute the square root or small and big numbers.
`(sqrt 1e-10)` returns `1.0000000015603234e-5`.
`(sqrt 1e60)` returns `1.0000000031080746e30`.
Our new version works way better for small or big numbers.