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))