]> git.rkrishnan.org Git - sicp.git/blob - src/sicp/ch2_1_extended.clj
Lazy version of evaluator and tests.
[sicp.git] / src / sicp / ch2_1_extended.clj
1 (ns sicp.ch2_1_extended
2   (:use [sicp utils ex2_7]
3         [clojure.test]))
4
5 ;; 2.1.4 - interval arithmetic
6 ;;(declare make-interval lower-bound upper-bound)
7
8 (defn add-interval [x y]
9   (make-interval (+ (lower-bound x) (lower-bound y))
10                  (+ (upper-bound x) (upper-bound y))))
11
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)
18                    (max p1 p2 p3 p4))))
19
20 (defn div-interval [x y]
21   (mul-interval x 
22                 (make-interval (/ 1.0 (upper-bound y))
23                                (/ 1.0 (lower-bound y)))))
24
25
26 ;; provide new constructors
27 (defn make-center-width [c w]
28   (make-interval (- c w) (+ c w)))
29
30 (defn center [i]
31   (/ (+ (lower-bound i) (upper-bound i)) 2))
32
33 (defn width [i]
34   (/ (- (upper-bound i) (lower-bound i)) 2))
35
36 ;; parallel-resistor formula
37 (defn par1 [r1 r2]
38   (div-interval (mul-interval r1 r2)
39                 (add-interval r1 r2)))
40
41 (defn par2 [r1 r2]
42   (let [one (make-interval 1 1)]
43     (div-interval one
44                   (add-interval (div-interval one r1)
45                                 (div-interval one r2)))))