X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=GHC%2FFloat.lhs;h=02aba8ca85f3fea261f8e8d3f22fa7f7787b37c0;hb=41e8fba828acbae1751628af50849f5352b27873;hp=7f0eddf6b3a63770fcaaad9772292bb7ddbf1d0b;hpb=a74057e4233a776f0a075fd68103cd5a2fbf9b19;p=ghc-base.git diff --git a/GHC/Float.lhs b/GHC/Float.lhs index 7f0eddf..02aba8c 100644 --- a/GHC/Float.lhs +++ b/GHC/Float.lhs @@ -1,9 +1,15 @@ \begin{code} -{-# OPTIONS_GHC -XNoImplicitPrelude #-} +{-# LANGUAGE CPP + , NoImplicitPrelude + , MagicHash + , UnboxedTuples + , ForeignFunctionInterface + #-} -- We believe we could deorphan this module, by moving lots of things -- around, but we haven't got there yet: {-# OPTIONS_GHC -fno-warn-orphans #-} {-# OPTIONS_HADDOCK hide #-} + ----------------------------------------------------------------------------- -- | -- Module : GHC.Float @@ -595,19 +601,19 @@ floatToDigits base x = -- will have an impossibly low exponent. Adjust for this. (f, e) = let n = minExp - e0 in - if n > 0 then (f0 `div` (b^n), e0+n) else (f0, e0) + if n > 0 then (f0 `quot` (expt b n), e0+n) else (f0, e0) (r, s, mUp, mDn) = if e >= 0 then - let be = b^ e in - if f == b^(p-1) then - (f*be*b*2, 2*b, be*b, b) + let be = expt b e in + if f == expt b (p-1) then + (f*be*b*2, 2*b, be*b, be) -- according to Burger and Dybvig else (f*be*2, 2, be, be) else - if e > minExp && f == b^(p-1) then - (f*b*2, b^(-e+1)*2, b, 1) + if e > minExp && f == expt b (p-1) then + (f*b*2, expt b (-e+1)*2, b, 1) else - (f*2, b^(-e)*2, 1, 1) + (f*2, expt b (-e)*2, 1, 1) k :: Int k = let @@ -653,7 +659,7 @@ floatToDigits base x = gen ds rn sN mUpN mDnN = let - (dn, rn') = (rn * base) `divMod` sN + (dn, rn') = (rn * base) `quotRem` sN mUpN' = mUpN * base mDnN' = mDnN * base in @@ -785,11 +791,20 @@ expt base n = if base == 2 && n >= minExpt && n <= maxExpt then expts!n else - base^n + if base == 10 && n <= maxExpt10 then + expts10!n + else + base^n expts :: Array Int Integer expts = array (minExpt,maxExpt) [(n,2^n) | n <- [minExpt .. maxExpt]] +maxExpt10 :: Int +maxExpt10 = 324 + +expts10 :: Array Int Integer +expts10 = array (minExpt,maxExpt10) [(n,10^n) | n <- [minExpt .. maxExpt10]] + -- Compute the (floor of the) log of i in base b. -- Simplest way would be just divide i by b until it's smaller then b, but that would -- be very slow! We are just slightly more clever.