;;;; Under Creative Commons Attribution-ShareAlike 4.0 ;;;; International. See ;;;; . (define-module (net ricketyspace sicp two eleven) #:use-module (net ricketyspace sicp two seven) #:export (mul-interval-alt)) (define (mul-interval-alt x y) (define lbx (lower-bound x)) (define ubx (upper-bound x)) (define lby (lower-bound y)) (define uby (upper-bound y)) (define (n a) (< a 0)) ; is negative (define (p a) (>= a 0)) ; is positive (define (signs slbx subx slby suby) (and (slbx lbx) (subx ubx) (slby lby) (suby uby))) (cond ((signs n p p p) (make-interval (* lbx uby) (* ubx uby))) ((signs p p n p) (make-interval (* ubx lby) (* ubx uby))) ((signs p p p p) (make-interval (* lbx lby) (* ubx uby))) ((signs n n n n) (make-interval (* lbx lby) (* ubx uby))) ((signs n n p p) (make-interval (* ubx uby) (* lbx lby))) ((signs p p n n) (make-interval (* ubx uby) (* lbx lby))) ((signs n n n p) (make-interval (* ubx uby) (* ubx lby))) ((signs n p n n) (make-interval (* ubx uby) (* lbx uby))) ((signs n p n p) (make-interval (min (* lbx uby) (* ubx lby)) (* ubx uby))) (else (error "Intervals not supported")))) ;;; Guile REPL ;;; ;;; scheme@(guile-user)> ,use (net ricketyspace sicp two eleven) ;;; scheme@(guile-user)> (mul-interval-alt (make-interval -2 -3) (make-interval 5 7)) ;;; $8 = (-21 . -10) ;;; scheme@(guile-user)> (mul-interval-alt (make-interval 2 3) (make-interval -5 -7)) ;;; $9 = (-21 . -10) ;;; scheme@(guile-user)> (mul-interval-alt (make-interval -2 3) (make-interval -5 7)) ;;; $10 = (-15 . 21) ;;; scheme@(guile-user)> (mul-interval-alt (make-interval -2 -3) (make-interval -5 7)) ;;; $11 = (-21 . 15) ;;; scheme@(guile-user)> (mul-interval-alt (make-interval -2 3) (make-interval -5 -7)) ;;; $12 = (-21 . 14) ;;; scheme@(guile-user)> (mul-interval-alt (make-interval -2 3) (make-interval 5 7)) ;;; $13 = (-14 . 21) ;;; scheme@(guile-user)> (mul-interval-alt (make-interval 2 3) (make-interval -5 7)) ;;; $14 = (-15 . 21) ;;; scheme@(guile-user)> (mul-interval-alt (make-interval 2 3) (make-interval 5 7)) ;;; $15 = (10 . 21) ;;; scheme@(guile-user)> (mul-interval-alt (make-interval -2 -3) (make-interval -5 -7)) ;;; $16 = (10 . 21) ;;; scheme@(guile-user)> (mul-interval-alt (make-interval -2 -3) (make-interval 5 7)) ;;; $17 = (-21 . -10) ;;; scheme@(guile-user)> (mul-interval-alt (make-interval 2 3) (make-interval -5 -7)) ;;; $18 = (-21 . -10) ;;; scheme@(guile-user)> (mul-interval-alt (make-interval -2 -3) (make-interval -5 7)) ;;; $19 = (-21 . 15) ;;; scheme@(guile-user)> (mul-interval-alt (make-interval -2 3) (make-interval -5 -7)) ;;; $20 = (-21 . 14) ;;; scheme@(guile-user)> (mul-interval-alt (make-interval -2 3) (make-interval -5 7)) ;;; $21 = (-15 . 21)