1 (ns sicp.ch2_1_extended
2 (:use [sicp utils ex2_7]
5 ;; 2.1.4 - interval arithmetic
6 ;;(declare make-interval lower-bound upper-bound)
8 (defn add-interval [x y]
9 (make-interval (+ (lower-bound x) (lower-bound y))
10 (+ (upper-bound x) (upper-bound y))))
12 (defn mul-interval [x y]
13 (let [p1 (* (lower-bound x) (lower-bound y))
14 p2 (* (lower-bound x) (upper-bound y))
15 p3 (* (upper-bound x) (lower-bound y))
16 p4 (* (upper-bound x) (upper-bound y))]
17 (make-interval (min p1 p2 p3 p4)
20 (defn div-interval [x y]
22 (make-interval (/ 1.0 (upper-bound y))
23 (/ 1.0 (lower-bound y)))))
26 ;; provide new constructors
27 (defn make-center-width [c w]
28 (make-interval (- c w) (+ c w)))
31 (/ (+ (lower-bound i) (upper-bound i)) 2))
34 (/ (- (upper-bound i) (lower-bound i)) 2))
36 ;; parallel-resistor formula
38 (div-interval (mul-interval r1 r2)
39 (add-interval r1 r2)))
42 (let [one (make-interval 1 1)]
44 (add-interval (div-interval one r1)
45 (div-interval one r2)))))