From 3ef8fe1739f23b1d29e4c2e224e056d10f51622b Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Thu, 5 Nov 2015 16:12:29 -0600 Subject: [PATCH] Fix type of expt for bignums that get converted to infinity. Found using random testing. Found 10 times. --- .../base-env/base-env-numeric.rkt | 27 ++++++++++--------- .../unit-tests/typecheck-tests.rkt | 1 + 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/typed-racket-lib/typed-racket/base-env/base-env-numeric.rkt b/typed-racket-lib/typed-racket/base-env/base-env-numeric.rkt index 1ff8157a..ae718b61 100644 --- a/typed-racket-lib/typed-racket/base-env/base-env-numeric.rkt +++ b/typed-racket-lib/typed-racket/base-env/base-env-numeric.rkt @@ -1610,22 +1610,25 @@ (-NonNegFlonum -NonNegFlonum . -> . -NonNegFlonum) (-NonNegFlonum -NonNegReal . -> . (Un -NonNegFlonum -One)) (-PosReal -NonNegFlonum . -> . (Un -NonNegFlonum -One)) - (-Flonum (Un -NegInt -PosInt) . -> . -Flonum) - (-Flonum -Int . -> . (Un -Flonum -One)) + ;; even integer exponents can give complex results + ;; too large exponents turn into infinities, and (expt -inf.0 -inf.0) => nan.0+nan.0i + ;; so no narrower cases for those. fixnums are ok, though + (-Flonum (Un -NegFixnum -PosFixnum) . -> . -Flonum) + (-Flonum -Fixnum . -> . (Un -Flonum -One)) (-Flonum -Flonum . -> . (Un -Flonum -FloatComplex)) ;; 1st arg can't be non-neg, -0.0 gives the wrong sign - (-PosSingleFlonum (Un -NonNegSingleFlonum -NegRat -PosRat) . -> . -NonNegSingleFlonum) - (-NonNegSingleFlonum (Un -NonNegSingleFlonum -NegRat -PosRat) . -> . -SingleFlonum) - (-SingleFlonum (Un -NegInt -PosInt) . -> . -SingleFlonum) - (-SingleFlonum -Int . -> . (Un -SingleFlonum -One)) + (-PosSingleFlonum (Un -NonNegSingleFlonum -NegFixnum -PosFixnum) . -> . -NonNegSingleFlonum) + (-NonNegSingleFlonum (Un -NonNegSingleFlonum -NegFixnum -PosFixnum) . -> . -SingleFlonum) + (-SingleFlonum (Un -NegFixnum -PosFixnum) . -> . -SingleFlonum) + (-SingleFlonum -Fixnum . -> . (Un -SingleFlonum -One)) (-SingleFlonum -SingleFlonum . -> . (Un -SingleFlonum -SingleFlonumComplex)) - (-PosInexactReal (Un -NegReal -PosReal) . -> . -NonNegInexactReal) - (-NonNegInexactReal (Un -NegReal -PosReal) . -> . -InexactReal) - (-PosReal -Real . -> . -NonNegReal) - (-NonNegReal -Real . -> . -Real) - (-InexactReal (Un -NegInt -PosInt) . -> . -InexactReal) + (-PosInexactReal (Un -NegFixnum -PosFixnum) . -> . -NonNegInexactReal) + (-NonNegInexactReal (Un -NegFixnum -PosFixnum) . -> . -InexactReal) + (-PosReal -Fixnum . -> . -NonNegReal) + (-NonNegReal -Fixnum . -> . -Real) + (-InexactReal (Un -NegFixnum -PosFixnum) . -> . -InexactReal) (-InexactReal -InexactReal . -> . (Un -InexactReal -InexactComplex)) - (-Real -Int . -> . -Real) + (-Real -Fixnum . -> . -Real) (-FloatComplex -FloatComplex . -> . -FloatComplex) (-FloatComplex -Flonum . -> . (Un -FloatComplex -Flonum)) (-FloatComplex -InexactReal . -> . (Un -FloatComplex -InexactReal)) diff --git a/typed-racket-test/unit-tests/typecheck-tests.rkt b/typed-racket-test/unit-tests/typecheck-tests.rkt index c9e75fbc..baed9bbe 100644 --- a/typed-racket-test/unit-tests/typecheck-tests.rkt +++ b/typed-racket-test/unit-tests/typecheck-tests.rkt @@ -457,6 +457,7 @@ (tc-e (bitwise-and (exact-round 1.7976931348623157e+308) (exact-round -29)) -Int) (tc-e (flexpt -0.0 -1.0) -Flonum) (tc-e (expt -0.0f0 -3.0) -InexactReal) + (tc-e (expt -8.665778974912815f+107 -677460115195106837726964554590085563061636191189747) -Number) (tc-e (exact->inexact 3) -PosFlonum) (tc-e (exact->inexact -3) -NegFlonum) (tc-e (real->double-flonum 0.0) -FlonumPosZero)