From 8fdb64723343dbd434430f45fa3a3e52aa9ed5d7 Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Tue, 8 May 2012 11:40:32 -0400 Subject: [PATCH] More precise type for flexpt. original commit: e786149434633b802f1c880799ad5d27b2361112 --- collects/tests/typed-racket/unit-tests/typecheck-tests.rkt | 3 +++ collects/typed-racket/base-env/base-env-numeric.rkt | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/collects/tests/typed-racket/unit-tests/typecheck-tests.rkt b/collects/tests/typed-racket/unit-tests/typecheck-tests.rkt index ef64d385..3fd6b499 100644 --- a/collects/tests/typed-racket/unit-tests/typecheck-tests.rkt +++ b/collects/tests/typed-racket/unit-tests/typecheck-tests.rkt @@ -185,6 +185,9 @@ (tc-e (expt 0.5 0.3) -PosFlonum) (tc-e (expt 0.5 2) -PosFlonum) (tc-e (expt 0.5 0) -PosReal) + (tc-e (flexpt 0.5 0.3) -NonNegFlonum) + (tc-e (flexpt 0.00000000001 100000000000.0) -NonNegFlonum) + (tc-e (flexpt -2.0 -0.5) -Flonum) ; NaN [tc-e/t (lambda: () 3) (t:-> -PosByte : -true-lfilter)] [tc-e/t (lambda: ([x : Number]) 3) (t:-> N -PosByte : -true-lfilter)] diff --git a/collects/typed-racket/base-env/base-env-numeric.rkt b/collects/typed-racket/base-env/base-env-numeric.rkt index bdf646b2..8eaf15f7 100644 --- a/collects/typed-racket/base-env/base-env-numeric.rkt +++ b/collects/typed-racket/base-env/base-env-numeric.rkt @@ -566,8 +566,11 @@ -Flonum))))) ; anything negative returns nan (define flexpt-type (lambda () - ;; could be more precise... - (from-cases (-Flonum -Flonum . -> . -Flonum)))) + (from-cases (-FlonumZero -Flonum . -> . -FlonumZero) ; (flexpt -0.0 0.1) -> 0.0 ; not sign preserving + (-Flonum -FlonumZero . -> . -PosFlonum) ; always returns 1.0 + (-NonNegFlonum -Flonum . -> . -NonNegFlonum) ; can underflow, so not closed on positives + (-NonPosFlonum -NonNegFlonum . -> . -NonPosFlonum) ; if we allow negative exponents, can return NaN, which is not NonPos + (-Flonum -Flonum . -> . -Flonum)))) (define fx->fl-type (lambda ()