A more efficient mul-interval
Your logic is correct.

You may use let instead of let* since the value of one binding does not depend on the value of another binding.

Since efficiency is important, you can cut back on the number of comparisons as well.  For example, if u-x is negative, then l-x is also negative and need not be tested.  For this reason, the functions negative?, positive? and straddles-zero? are not necessary.  Instead, you can simply use nested ifs:

(if (&lt; u-x 0)
    ; x is in R &lt; 0
    (if (&lt; u-y 0)
        ; y is in R &lt; 0
        ...
        (if (&lt; l-y 0)
            ; y contains 0
            ...
            ; y is in R &gt;= 0
            ... ))
    (if (&lt; l-x 0)
        ; x contains 0
        ...
        ; x is in R &gt;= 0
        ... ))