理系学生日記

おまえはいつまで学生気分なのか

問題2-11

Benがすごくウザい件について。

ついでにBenはなぞめいたことをいった:「区間の端点の符号を調べると、mul-intervalを九つの場合に分けることが出来(略

あと訳としてこれはない。

only one of which requires more than two multiplications.

http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html#%_thm_2.11

の訳が

そのうち一つだけが二回以上の乗算を必要とする.

more thanの訳は「以上」じゃNEEEEEEEEEEEEEEEEE!!!!!!!!!最初マジでわからなかった。

(define (multi-interval z w)
  (let ((a (lower-bound z))
	(b (upper-bound z))
	(x (lower-bound w))
	(y (upper-bound w)))
    (cond ((and (< a 0)  (< b 0)  (< x 0)  (< y 0))  (make-interval (* b y) (* a x)))
	  ((and (< a 0)  (< b 0)  (< x 0)  (>= y 0)) (make-interval (* b y) (* b x)))
	  ((and (< a 0)  (< b 0)  (>= x 0) (>= y 0)) (make-interval (* b y) (* a x)))
	  ((and (< a 0)  (>= b 0) (< x 0)  (< y 0))  (make-interval (* b y) (* a y)))
	  ((and (< a 0)  (>= b 0) (< x 0)  (>= y 0)) (make-interval (min (* a y) (* b x))
								    (max (* a x) (* b y))))
	  ((and (< a 0)  (>= b 0) (>= x 0) (>= y 0)) (make-interval (* a y) (* b y)))
	  ((and (>= a 0) (>= b 0) (< x 0)  (< y 0))  (make-interval (* b y) (* a x)))
	  ((and (>= a 0) (>= b 0) (< x 0)  (>= y 0)) (make-interval (* b x) (* b y)))
	  ((and (>= a 0) (>= b 0) (>= x 0) (>= y 0)) (make-interval (* a x) (* b y))))))

あと、今まで暗黙の了解として区間は全て正の数で構成されると思っていたのだけども、ちがうのね。