;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ereal.scm ;; ;; Extended Reals implemented with BigDecimals ;; ;; This defines the following "public" procedures and constants ;; (s->r S) -- parses a string into an extended real ;; +inf -inf -zero zero one -one NaN ;; +lo +hi -lo -hi *lo *hi /lo /hi ;; r>0 r<0 r<=0 r>=0 r x) (cond ((or (.equals x +inf) (.equals x -inf) (.equals x -zero)) x) (else (java.math.BigDecimal. (.toString x))))) ;string->real (define (s->r x) (cond ((.equals x "inf") +inf) ((.equals x "+inf") +inf) ((.equals x "-inf") -inf) ((.equals x "-0") -zero) (else (java.math.BigDecimal. x)))) ;; pretty print an extended real (define (pp-r x) (cond ((equal? x +inf) "+inf") ((equal? x -inf) "-inf") ((equal? x -zero) "-0.0") ((equal? x NaN) "NaN") (else (.toString x)))) ;; special values for reals (define +inf java.lang.Double.POSITIVE_INFINITY$) (define -inf java.lang.Double.NEGATIVE_INFINITY$) (define -zero (/ 1 -inf)) (define zero (java.math.BigDecimal. "0.0")) (define one (java.math.BigDecimal. "1.0")) (define -one (java.math.BigDecimal. "-1.0")) (define NaN java.lang.Double.NaN$) ;; tests on extended reals (define (classify-r x) (cond ((.equals +inf x) 3.0) ((.equals -inf x) -3.0) ((.equals -zero x) -1.0) ((.isInstance java.math.BigDecimal.class x) (let ((zz (* 2.0 (.compareTo x zero)))) (if (= zz 0) 1 (* 2.0 zz)))) (else NaN))) (define (isPosInf x) (= 3.0 (classify-r x))) (define (isNegInf x) (= -3.0 (classify-r x))) (define (isInfinite x) (or (isPosInf x) (isNegInf x))) (define (isFinite x) (not (isInfinite x))) (define (isPositive x) (> (classify-r x) 1.0)) (define (isNonNegative x) (>= (classify-r x) -1.0)) (define (isZero x) (= (Math.abs (classify-r x)) 1)) (define (isPosZero x) (= 1 (classify-r x))) (define (isNegZero x) (= -1 (classify-r x))) (define (isNonPositive x) (<= (classify-r x) 1.0)) (define (isNegative x) (<= (classify-r x) -1.0)) (define r>0 isPositive) (define r<0 isNegative) (define r<=0 isNonPositive) (define r>=0 isNonNegative) (define (