SICP §2.1.4 拡張問題: 区間算術演算

精度の分かっているものに対する誤差を考慮にいれた演算を考えるというセクション。
このセクションでは電気回路で使用する抵抗について考えていて、例えば次のようにモデルを構築している。


10%の許容誤差で6.8Ω
  ↓
下限値 = 6.8 - 0.68 = 6.12
上限値 = 6.8 + 0.68 = 7.48
ここでは、このモデルを抽象化した「区間」を考慮した演算の手続きの定義が記載されている。
区間オブジェクトは、下限値と上限値を内部に持つモデルになっている感じ。
この後の問題でしばしば参照されると思うのでこのエントリで記載しておこう。

;区間オブジェクトの和算
(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)
  (mul-interval x
		(make-interval (/ 1.0 (upper-bound y))
			       (/ 1.0 (lower-bound y)))))

明らさまに減算手続きの定義がないが、これは以降の問題で定義することになる。
あと、各演算手続きで使用されている make-interval とか lower-bound、upper-bound とかも。