Chapter 2
2.1 Exercise 2.1
2.2 Exercise 2.2
2.3 Exercise 2.3
2.4 Exercise 2.4
2.5 Exercise 2.5
2.6 Exercise 2.6
2.7 Exercise 2.7
2.8 Exercise 2.8
2.9 Exercise 2.9
2.10 Exercise 2.10
2.11 Exercise 2.11
2.12 Exercise 2.12
2.13 Exercise 2.13
2.14 Exercise 2.14
2.15 Exercise 2.15
2.16 Exercise 2.16
2.17 Exercise 2.17
2.18 Exercise 2.18
2.19 Exercise 2.19
2.20 Exercise 2.20
2.21 Exercise 2.21
2.22 Exercise 2.22
2.23 Exercise 2.23
2.24 Exercise 2.24
2.25 Exercise 2.25
2.26 Exercise 2.26
2.27 Exercise 2.27
2.28 Exercise 2.28
2.29 Exercise 2.29
2.30 Exercise 2.30
2.31 Exercise 2.31
2.32 Exercise 2.32
2.33 Exercise 2.33
2.34 Exercise 2.34
2.35 Exercise 2.35
2.36 Exercise 2.36
2.37 Exercise 2.37
2.38 Exercise 2.38
2.39 Exercise 2.39
2.40 Exercise 2.40
2.41 Exercise 2.41
2.42 Exercise 2.42
2.43 Exercise 2.43
2.44 Exercise 2.44
2.45 Exercise 2.45
2.46 Exercise 2.46
2.47 Exercise 2.47
2.48 Exercise 2.48
2.49 Exercise 2.49
2.50 Exercise 2.50
2.51 Exercise 2.51
2.52 Exercise 2.52
2.53 Exercise 2.53
2.54 Exercise 2.54
2.55 Exercise 2.55
2.56 Exercise 2.56
2.57 Exercise 2.57
2.58 Exercise 2.58
2.59 Exercise 2.59
2.60 Exercise 2.60
2.61 Exercise 2.61
2.62 Exercise 2.62
2.63 Exercise 2.63
2.64 Exercise 2.64
2.65 Exercise 2.65
2.66 Exercise 2.66
2.67 Exercise 2.67
2.68 Exercise 2.68
2.69 Exercise 2.69
2.70 Exercise 2.70
2.71 Exercise 2.71
2.72 Exercise 2.72
2.73 Exercise 2.73
2.74 Exercise 2.74
2.75 Exercise 2.75
2.76 Exercise 2.76
2.77 Exercise 2.77
2.78 Exercise 2.78
2.79 Exercise 2.79
2.80 Exercise 2.80
2.81 Exercise 2.81
2.82 Exercise 2.82
2.83 Exercise 2.83
2.84 Exercise 2.84
2.85 Exercise 2.85
2.86 Exercise 2.86
2.87 Exercise 2.87
2.88 Exercise 2.88
2.89 Exercise 2.89
2.90 Exercise 2.90
2.91 Exercise 2.91
2.92 Exercise 2.92
2.93 Exercise 2.93
2.94 Exercise 2.94
2.95 Exercise 2.95
2.96 Exercise 2.96
2.97 Exercise 2.97

2.10 Exercise 2.10

Before modifying any code, we need to understand: Why does it not make sense to divide by an interval that spans zero?

When in doubt, we can manipulate interval with our procedures to investigate. But first, a procedure for computing the reciprocal of an interval:

(define (reciprocal i)
  (make-interval (/ 1.0 (upper-bound i))
                 (/ 1.0 (lower-bound i))))

Now we can do the following:

> (define i1 (make-interval 1 10))
> (define i2 (make-interval -5 5))
> (define ri1 (reciprocal i1))
> (define ri2 (reciprocal i2))
> ri1

(mcons 0.1 1.0)

> ri2

(mcons 0.2 -0.2)

Notice how the upper bound of ri1 is still greater than the lower bound, but that this is not true for ri2. In other words, taking the reciprocal of an interval spanning zero did not create a valid interval.

We can explore this more algebraically. Let i be an interval not spanning 0, and let x be its lower bound and y be its upper bound. By definition, x < y. It is trivial to see that (1 / x) > (1 / y), and that an interval defined by ((1 / y), (1 / x)) is valid.

However, suppose i does span zero, such that x < 0 < y. It is then true that (1 / x) < 0 and (1 / y) > 0 – in other words, that (1 / x) < (1 / y). An interval defined by ((1 / y), (1 / x)) is therefore not valid.

TODO: I think I’m on to something, but multiplying will still make an interval

Fixing Alyssa’s code is simple (and more readable because of the new reciprocal procedure):

(define (div-interval x y)
  (if (and (< (lower-bound y) 0) (> (upper-bound y) 0))
      (error "Cannot divide by an interval spanning zero")
      (mul-interval x (reciprocal y))))