SICP 2.10
手続きを実行する前にチェック処理を入れるだけ。
(define make-interval cons) (define upper-bound car) (define lower-bound cdr) (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))))) (define (div-interval-fixed x y) (if (> 0 (* (upper-bound y) (lower-bound y))) (error "Divide operation error") (mul-interval x (make-interval (/ 1.0 (upper-bound y)) (/ 1.0 (lower-bound y)))))) ; test (let ((i1 (make-interval 3.0 1.1)) (i2 (make-interval 2.0 -2.5))) (div-interval i1 i2) (div-interval-fixed i1 i2))