Blame


1 665c255d 2023-08-04 jrmu (define (add-interval x y)
2 665c255d 2023-08-04 jrmu (make-interval (+ (lower-bound x) (lower-bound y))
3 665c255d 2023-08-04 jrmu (+ (upper-bound x) (upper-bound y))))
4 665c255d 2023-08-04 jrmu ;; (define (div-interval x y)
5 665c255d 2023-08-04 jrmu ;; (mul-interval x
6 665c255d 2023-08-04 jrmu ;; (make-interval (/ 1.0 (upper-bound y))
7 665c255d 2023-08-04 jrmu ;; (/ 1.0 (lower-bound y)))))
8 665c255d 2023-08-04 jrmu
9 665c255d 2023-08-04 jrmu (define (make-interval lower upper)
10 665c255d 2023-08-04 jrmu (cons lower upper))
11 665c255d 2023-08-04 jrmu (define (upper-bound interval)
12 665c255d 2023-08-04 jrmu (cdr interval))
13 665c255d 2023-08-04 jrmu (define (lower-bound interval)
14 665c255d 2023-08-04 jrmu (car interval))
15 665c255d 2023-08-04 jrmu
16 665c255d 2023-08-04 jrmu (define (sub-interval x y)
17 665c255d 2023-08-04 jrmu (make-interval (- (lower-bound x) (upper-bound y))
18 665c255d 2023-08-04 jrmu (- (upper-bound x) (lower-bound y))))
19 665c255d 2023-08-04 jrmu
20 665c255d 2023-08-04 jrmu (define (div-interval x y)
21 665c255d 2023-08-04 jrmu (define (spans-zero? interval)
22 665c255d 2023-08-04 jrmu (and (<= (lower-bound interval) 0)
23 665c255d 2023-08-04 jrmu (<= 0 (upper-bound interval))))
24 665c255d 2023-08-04 jrmu (if (spans-zero? y)
25 665c255d 2023-08-04 jrmu (error "Division by zero")
26 665c255d 2023-08-04 jrmu (mul-interval x
27 665c255d 2023-08-04 jrmu (make-interval (/ 1.0 (upper-bound y))
28 665c255d 2023-08-04 jrmu (/ 1.0 (lower-bound y))))))
29 665c255d 2023-08-04 jrmu
30 665c255d 2023-08-04 jrmu ;; 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.
31 665c255d 2023-08-04 jrmu
32 665c255d 2023-08-04 jrmu (define (mul-interval x y)
33 665c255d 2023-08-04 jrmu (let ((p1 (* (lower-bound x) (lower-bound y)))
34 665c255d 2023-08-04 jrmu (p2 (* (lower-bound x) (upper-bound y)))
35 665c255d 2023-08-04 jrmu (p3 (* (upper-bound x) (lower-bound y)))
36 665c255d 2023-08-04 jrmu (p4 (* (upper-bound x) (upper-bound y))))
37 665c255d 2023-08-04 jrmu (make-interval (min p1 p2 p3 p4)
38 665c255d 2023-08-04 jrmu (max p1 p2 p3 p4))))
39 665c255d 2023-08-04 jrmu
40 665c255d 2023-08-04 jrmu (define (mul-interval x y)
41 665c255d 2023-08-04 jrmu (let ((lx (lower-bound x))
42 665c255d 2023-08-04 jrmu (ly (lower-bound y))
43 665c255d 2023-08-04 jrmu (ux (upper-bound x))
44 665c255d 2023-08-04 jrmu (uy (upper-bound y)))
45 665c255d 2023-08-04 jrmu (cond ((and (< ux 0)
46 665c255d 2023-08-04 jrmu (< uy 0)) (make-interval (* ux uy)
47 665c255d 2023-08-04 jrmu (* lx ly)))
48 665c255d 2023-08-04 jrmu ((and (> lx 0)
49 665c255d 2023-08-04 jrmu (> ly 0)) (make-interval (* lx ly)
50 665c255d 2023-08-04 jrmu (* ux uy)))
51 665c255d 2023-08-04 jrmu ((and (< ux 0)
52 665c255d 2023-08-04 jrmu (> ly 0)) (make-interval (* lx uy)
53 665c255d 2023-08-04 jrmu (* ux ly)))
54 665c255d 2023-08-04 jrmu ((and (> lx 0)
55 665c255d 2023-08-04 jrmu (< uy 0)) (make-interval (* ux ly)
56 665c255d 2023-08-04 jrmu (* lx uy)))
57 665c255d 2023-08-04 jrmu ((and (< lx 0)
58 665c255d 2023-08-04 jrmu (> ux 0)
59 665c255d 2023-08-04 jrmu (< uy 0)) (make-interval (* ux ly)
60 665c255d 2023-08-04 jrmu (* lx ly)))
61 665c255d 2023-08-04 jrmu ((and (< lx 0)
62 665c255d 2023-08-04 jrmu (> ux 0)
63 665c255d 2023-08-04 jrmu (> ly 0)) (make-interval (* lx uy)
64 665c255d 2023-08-04 jrmu (* ux uy)))
65 665c255d 2023-08-04 jrmu ((and (< ux 0)
66 665c255d 2023-08-04 jrmu (< ly 0)
67 665c255d 2023-08-04 jrmu (> uy 0)) (make-interval (* lx uy)
68 665c255d 2023-08-04 jrmu (* lx ly)))
69 665c255d 2023-08-04 jrmu ((and (> lx 0)
70 665c255d 2023-08-04 jrmu (< ly 0)
71 665c255d 2023-08-04 jrmu (> uy 0)) (make-interval (* ux ly)
72 665c255d 2023-08-04 jrmu (* ux uy)))
73 665c255d 2023-08-04 jrmu ((and (< lx 0)
74 665c255d 2023-08-04 jrmu (> ux 0)
75 665c255d 2023-08-04 jrmu (< ly 0)
76 665c255d 2023-08-04 jrmu (> uy 0)) (make-interval (min (* lx uy)
77 665c255d 2023-08-04 jrmu (* ux ly))
78 665c255d 2023-08-04 jrmu (max (* lx lx)
79 665c255d 2023-08-04 jrmu (* ux uy)))))))
80 665c255d 2023-08-04 jrmu