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)
7 (define (upper-bound interval)
9 (define (lower-bound 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))))
21 (error "Division by zero")
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))
32 (< uy 0)) (make-interval (* ux uy)
35 (> ly 0)) (make-interval (* lx ly)
38 (> ly 0)) (make-interval (* lx uy)
41 (< uy 0)) (make-interval (* ux ly)
45 (< uy 0)) (make-interval (* ux ly)
49 (> ly 0)) (make-interval (* lx uy)
53 (> uy 0)) (make-interval (* lx uy)
57 (> uy 0)) (make-interval (* ux ly)
62 (> uy 0)) (make-interval (min (* lx uy)
70 (define (make-center-width c w)
71 (make-interval (- c w) (+ c w)))
73 (/ (+ (lower-bound i) (upper-bound i)) 2))
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)
91 (display (lower-bound interval))
93 (display (upper-bound interval))
96 (define (test-case actual expected)
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)
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)
109 (print-interval (make-center-percent 1.0 3))
110 (print-interval (make-interval 0.97 1.03))
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)