1 (define (add-interval x y)
2 (make-interval (+ (lower-bound x) (lower-bound y))
3 (+ (upper-bound x) (upper-bound y))))
4 ;; (define (div-interval x y)
6 ;; (make-interval (/ 1.0 (upper-bound y))
7 ;; (/ 1.0 (lower-bound y)))))
9 (define (make-interval lower upper)
11 (define (upper-bound interval)
13 (define (lower-bound interval)
16 (define (sub-interval x y)
17 (make-interval (- (lower-bound x) (upper-bound y))
18 (- (upper-bound x) (lower-bound y))))
20 (define (div-interval x y)
21 (define (spans-zero? interval)
22 (and (<= (lower-bound interval) 0)
23 (<= 0 (upper-bound interval))))
25 (error "Division by zero")
27 (make-interval (/ 1.0 (upper-bound y))
28 (/ 1.0 (lower-bound y))))))
30 ;; Exercise 2.11. In passing, Ben also cryptically comments: ``By testing the signs of the endpoints of the intervals, it is possible to break mul-interval into nine cases, only one of which requires more than two multiplications.'' Rewrite this procedure using Ben's suggestion.
32 (define (mul-interval x y)
33 (let ((p1 (* (lower-bound x) (lower-bound y)))
34 (p2 (* (lower-bound x) (upper-bound y)))
35 (p3 (* (upper-bound x) (lower-bound y)))
36 (p4 (* (upper-bound x) (upper-bound y))))
37 (make-interval (min p1 p2 p3 p4)
40 (define (mul-interval x y)
41 (let ((lx (lower-bound x))
46 (< uy 0)) (make-interval (* ux uy)
49 (> ly 0)) (make-interval (* lx ly)
52 (> ly 0)) (make-interval (* lx uy)
55 (< uy 0)) (make-interval (* ux ly)
59 (< uy 0)) (make-interval (* ux ly)
63 (> ly 0)) (make-interval (* lx uy)
67 (> uy 0)) (make-interval (* lx uy)
71 (> uy 0)) (make-interval (* ux ly)
76 (> uy 0)) (make-interval (min (* lx uy)