Blob


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)
5 ;; (mul-interval x
6 ;; (make-interval (/ 1.0 (upper-bound y))
7 ;; (/ 1.0 (lower-bound y)))))
9 (define (make-interval lower upper)
10 (cons lower upper))
11 (define (upper-bound interval)
12 (cdr interval))
13 (define (lower-bound interval)
14 (car 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))))
24 (if (spans-zero? y)
25 (error "Division by zero")
26 (mul-interval x
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)
38 (max p1 p2 p3 p4))))
40 (define (mul-interval x y)
41 (let ((lx (lower-bound x))
42 (ly (lower-bound y))
43 (ux (upper-bound x))
44 (uy (upper-bound y)))
45 (cond ((and (< ux 0)
46 (< uy 0)) (make-interval (* ux uy)
47 (* lx ly)))
48 ((and (> lx 0)
49 (> ly 0)) (make-interval (* lx ly)
50 (* ux uy)))
51 ((and (< ux 0)
52 (> ly 0)) (make-interval (* lx uy)
53 (* ux ly)))
54 ((and (> lx 0)
55 (< uy 0)) (make-interval (* ux ly)
56 (* lx uy)))
57 ((and (< lx 0)
58 (> ux 0)
59 (< uy 0)) (make-interval (* ux ly)
60 (* lx ly)))
61 ((and (< lx 0)
62 (> ux 0)
63 (> ly 0)) (make-interval (* lx uy)
64 (* ux uy)))
65 ((and (< ux 0)
66 (< ly 0)
67 (> uy 0)) (make-interval (* lx uy)
68 (* lx ly)))
69 ((and (> lx 0)
70 (< ly 0)
71 (> uy 0)) (make-interval (* ux ly)
72 (* ux uy)))
73 ((and (< lx 0)
74 (> ux 0)
75 (< ly 0)
76 (> uy 0)) (make-interval (min (* lx uy)
77 (* ux ly))
78 (max (* lx lx)
79 (* ux uy)))))))