More precise type for flexpt.

original commit: e786149434633b802f1c880799ad5d27b2361112
This commit is contained in:
Vincent St-Amour 2012-05-08 11:40:32 -04:00
parent d2431e07d5
commit 8fdb647233
2 changed files with 8 additions and 2 deletions

View File

@ -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)]

View File

@ -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 ()