# SICP Solutions: Section 1.1.7

## Section 1.1.7

### Exercise 1.6

If `if`

is not a special form, and is a procedure based on `cond`

instead, it
would lose its short-circuiting property, as, due to applicative-order
evaluation, all of the arguments would need be evaluated just as the
`new-if`

procedure would be called.

In our case, the program would fall into an infinite loop, always trying to
evaluate the next `sqrt-iter`

, even if `good-enough?`

would return true.

### Exercise 1.7

For very small numbers, `0.001`

will be of the same order of magnitude with the
solution. This means that the tolerance will not be adequate to reach a
good-enough solution. For example, calculating the square root of `0.0001`

itself (which is `0.01`

), our algorithm will yield:

For very large numbers, the algorithm might never terminate because the machine
precision will not be able to represent small differences between large numbers.
This means that `good-enough?`

will never return `#t`

. The tipping point is
between \( 10^{12} \) (which returns) and \( 10^{13} \) (which runs
infinitely).

What happens is that after a few iterations, the `guess`

will be
`3,162,277.6601683795`

. When running `good-enough?`

, the procedure will try to
square it, yielding `10,000,000,000,000.002`

, which isn’t good enough according
to the `0.001`

desired error. When trying to improve this, the procedure will
need the average of the guess and of the `x/y = 3,162,277.660168379`

. However,
this reaches the limit of the numbers that can be represented, and the average
is again `3,162,277.6601683795`

which means `guess`

will remain unchanged and
the program will enter an infinite loop.

To improve, we can use the following listing which uses the suggested solution
of making sure that the guess actually improves between runs, again using the
value `0.001`

as a threshold - if the ratio between or old guess and the new
one hasn’t changed at least by that number, then we consider our calculations
finished.

### Exercise 1.8

We just need to use a different `improve`

procedure: