diff --git a/src/ikarus.boot b/src/ikarus.boot index ecdeafe..01c20fb 100644 Binary files a/src/ikarus.boot and b/src/ikarus.boot differ diff --git a/src/ikarus.numerics.ss b/src/ikarus.numerics.ss index d67467b..1cc211a 100644 --- a/src/ikarus.numerics.ss +++ b/src/ikarus.numerics.ss @@ -91,18 +91,30 @@ ; | | | | | | | ; v0 v1 v2 v3 v4 v5 v6 v7 (define ($flonum pos? e f6 f5 f4 f3 f2 f1 f0) - (let ([v ($make-flonum)]) - (let ([be (fx+ e 1075)]) - (let ([sbe (if pos? be (fxlogor be (fxsll 1 11)))]) - ($flonum-set! v 0 (fxsra sbe 4)) - ($flonum-set! v 1 (fxlogor (fxsll sbe 4) (fxlogand f6 #b1111))) - ($flonum-set! v 2 f5) - ($flonum-set! v 3 f4) - ($flonum-set! v 4 f3) - ($flonum-set! v 5 f2) - ($flonum-set! v 6 f1) - ($flonum-set! v 7 f0))) - v)) + (let ([be (fx+ e 1075)]) + (let ([v ($make-flonum)]) + (cond + [(fx< be 2047) + (let ([sbe (if pos? be (fxlogor be (fxsll 1 11)))]) + ($flonum-set! v 0 (fxsra sbe 4)) + ($flonum-set! v 1 (fxlogor (fxsll sbe 4) (fxlogand f6 #b1111))) + ($flonum-set! v 2 f5) + ($flonum-set! v 3 f4) + ($flonum-set! v 4 f3) + ($flonum-set! v 5 f2) + ($flonum-set! v 6 f1) + ($flonum-set! v 7 f0))] + [else ;;; inf + (let ([sbe (if pos? 2047 (fxlogor 2047 (fxsll 1 11)))]) + ($flonum-set! v 0 (fxsra sbe 4)) + ($flonum-set! v 1 (fxsll sbe 4)) + ($flonum-set! v 2 0) + ($flonum-set! v 3 0) + ($flonum-set! v 4 0) + ($flonum-set! v 5 0) + ($flonum-set! v 6 0) + ($flonum-set! v 7 0))]) + v))) (define ($flonum/c0 pos? e f6 f5 f4 f3 f2 f1 f0 c) (define ($fxeven? x) (fxzero? (fxlogand x 1)))