Blob


1 (define (add-interval x y)
2 (make-interval (+ (lower-bound x) (lower-bound y))
3 (+ (upper-bound x) (upper-bound y))))
5 (define (make-interval lower upper)
6 (cons lower upper))
7 (define (upper-bound interval)
8 (cdr interval))
9 (define (lower-bound interval)
10 (car interval))
12 (define (sub-interval x y)
13 (make-interval (- (lower-bound x) (upper-bound y))
14 (- (upper-bound x) (lower-bound y))))
16 (define (div-interval x y)
17 (define (spans-zero? interval)
18 (and (<= (lower-bound interval) 0)
19 (<= 0 (upper-bound interval))))
20 (if (spans-zero? y)
21 (error "Division by zero")
22 (mul-interval x
23 (make-interval (/ 1.0 (upper-bound y))
24 (/ 1.0 (lower-bound y))))))
26 (define (mul-interval x y)
27 (let ((lx (lower-bound x))
28 (ly (lower-bound y))
29 (ux (upper-bound x))
30 (uy (upper-bound y)))
31 (cond ((and (< ux 0)
32 (< uy 0)) (make-interval (* ux uy)
33 (* lx ly)))
34 ((and (> lx 0)
35 (> ly 0)) (make-interval (* lx ly)
36 (* ux uy)))
37 ((and (< ux 0)
38 (> ly 0)) (make-interval (* lx uy)
39 (* ux ly)))
40 ((and (> lx 0)
41 (< uy 0)) (make-interval (* ux ly)
42 (* lx uy)))
43 ((and (< lx 0)
44 (> ux 0)
45 (< uy 0)) (make-interval (* ux ly)
46 (* lx ly)))
47 ((and (< lx 0)
48 (> ux 0)
49 (> ly 0)) (make-interval (* lx uy)
50 (* ux uy)))
51 ((and (< ux 0)
52 (< ly 0)
53 (> uy 0)) (make-interval (* lx uy)
54 (* lx ly)))
55 ((and (> lx 0)
56 (< ly 0)
57 (> uy 0)) (make-interval (* ux ly)
58 (* ux uy)))
59 ((and (< lx 0)
60 (> ux 0)
61 (< ly 0)
62 (> uy 0)) (make-interval (min (* lx uy)
63 (* ux ly))
64 (max (* lx lx)
65 (* ux uy)))))))
70 (define (make-center-width c w)
71 (make-interval (- c w) (+ c w)))
72 (define (center i)
73 (/ (+ (lower-bound i) (upper-bound i)) 2))
74 (define (width i)
75 (/ (- (upper-bound i) (lower-bound i)) 2))
77 ;; Exercise 2.12. Define a constructor make-center-percent that takes a center and a percentage tolerance and produces the desired interval. You must also define a selector percent that produces the percentage tolerance for a given interval. The center selector is the same as the one shown above.
79 ;; width/center = tolerance = percent / 100
80 ;; width = percent * center / 100
81 (define (make-center-percent center percent)
82 (make-center-width center (abs (* percent center 0.01))))
84 ;; percent = 100 * width / center
85 (define (percent interval)
86 (/ (* 100 (width interval))
87 (abs (center interval))))
89 (define (print-interval interval)
90 (display "Lb: ")
91 (display (lower-bound interval))
92 (display " Ub: ")
93 (display (upper-bound interval))
94 (newline))
96 (define (test-case actual expected)
97 (load-option 'format)
98 (newline)
99 (format #t "Actual: ~A Expected: ~A" actual expected))
101 (print-interval (make-center-percent 100.0 10))
102 (print-interval (make-interval 90.0 110.0))
103 (test-case (percent (make-center-percent 100.0 10)) 10)
104 (newline)
105 (print-interval (make-center-percent 2.0 5))
106 (print-interval (make-interval 1.9 2.1))
107 (test-case (percent (make-center-percent 2.0 5)) 5)
108 (newline)
109 (print-interval (make-center-percent 1.0 3))
110 (print-interval (make-interval 0.97 1.03))
111 (newline)
112 (test-case (percent (make-center-percent 1.0 3)) 3)
113 (print-interval (make-center-percent 0 100))
114 (print-interval (make-interval 0 0))
115 ;; this would give an error message...
116 ;; (test-case (percent (make-center-percent 0 100)) (error "Division by zero"))
117 (print-interval (make-center-percent 25 0))
118 (print-interval (make-interval 25 25))
119 (test-case (percent (make-center-percent 25 0)) 0)