28Jul/090
Exercise 2.12 of SICP
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.
(define (make-center-percent value p) (make-center-width value (* value (/ p 100.0)))) (define (percent int) (* 100 (/ (width int) (center int)))) (define (make-interval a b) (cons a b)) (define (lower-bound int) (car int)) (define (upper-bound int) (cdr int)) (define (make-center-width c w) (make-interval (- c w) (+ c w))) (define (center i) (/ (+ (lower-bound i) (upper-bound i)) 2)) (define (width i) (/ (- (upper-bound i) (lower-bound i)) 2)) (define (add-interval x y) (make-interval (+ (lower-bound x) (lower-bound y)) (+ (upper-bound x) (upper-bound y)))) (define (mul-interval x y) (let ((p1 (* (lower-bound x) (lower-bound y))) (p2 (* (lower-bound x) (upper-bound y))) (p3 (* (upper-bound x) (lower-bound y))) (p4 (* (upper-bound x) (upper-bound y)))) (make-interval (min p1 p2 p3 p4) (max p1 p2 p3 p4)))) (define (div-interval x y) (define (spans-zero? i) (and (not (> (lower-bound i) 0)) (not (< (upper-bound i) 0)))) (if (spans-zero? y) (error "The dividing interval cannot span 0.") (mul-interval x (make-interval (/ 1.0 (upper-bound y)) (/ 1.0 (lower-bound y)))))) (define (sub-interval2 x y) (let ((p1 (- (lower-bound x) (lower-bound y))) (p2 (- (lower-bound x) (upper-bound y))) (p3 (- (upper-bound x) (lower-bound y))) (p4 (- (upper-bound x) (upper-bound y)))) (make-interval (min p1 p2 p3 p4) (max p1 p2 p3 p4)))) (define (sub-interval x y) (make-interval (- (lower-bound x) (upper-bound y)) (- (upper-bound x) (lower-bound y)))) (define (print int) (newline) (display "[") (display (lower-bound int)) (display ",") (display (upper-bound int)) (display "]") (newline))
> (print (make-center-percent 10 12))
[8.8,11.2]
> (percent (make-center-percent 10 12))
11.999999999999993