hmpfr 0.1.1 → 0.1.2
raw patch · 8 files changed
+54/−29 lines, 8 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- Data/Number/MPFR/Arithmetic.hs +4/−4
- Data/Number/MPFR/Comparison.hs +3/−3
- Data/Number/MPFR/Conversion.hs +6/−1
- Data/Number/MPFR/FFIhelper.hsc +18/−7
- Data/Number/MPFR/Internal.hs +6/−6
- Data/Number/MPFR/Misc.hs +10/−4
- hmpfr.cabal +3/−3
- test/Demo.hs +4/−1
Data/Number/MPFR/Arithmetic.hs view
@@ -19,11 +19,11 @@ import Data.Number.MPFR.Internal add :: RoundMode -> Precision -> MPFR -> MPFR -> MPFR-add r p d1 d2 = fst $ add_ r p d1 d2 +add r p d1 d2 = fst $ add_ r p d1 d2 addw :: RoundMode -> Precision -> MPFR -> Word -> MPFR addw r p d1 d = fst $ addw_ r p d1 d - + addi :: RoundMode -> Precision -> MPFR -> Int -> MPFR addi r p d1 d = fst $ addi_ r p d1 d @@ -122,7 +122,7 @@ addw_ :: RoundMode -> Precision -> MPFR -> Word -> (MPFR, Int) addw_ r p d1 d = withMPFRBAui r p d1 (fromIntegral d) mpfr_add_ui- + addi_ :: RoundMode -> Precision -> MPFR -> Int -> (MPFR, Int) addi_ r p d1 d = withMPFRBAsi r p d1 (fromIntegral d) mpfr_add_si @@ -140,7 +140,7 @@ isub_ :: RoundMode -> Precision -> Int -> MPFR -> (MPFR, Int) isub_ r p d d1 = withMPFRBAis r p (fromIntegral d) d1 mpfr_si_sub- + mul_ :: RoundMode -> Precision -> MPFR -> MPFR -> (MPFR,Int) mul_ r p d1 d2 = withMPFRsBA r p d1 d2 mpfr_mul
Data/Number/MPFR/Comparison.hs view
@@ -72,16 +72,16 @@ else Just (compare (withMPFRBB mp1 mp2 mpfr_cmpabs) 0) isNaN :: MPFR -> Bool-isNaN d = withMPFRB d mpfr_nan_p /= 0+isNaN (MP _ _ e _) = e == expNaN -- withMPFRB d mpfr_nan_p /= 0 isInfinite :: MPFR -> Bool-isInfinite d = withMPFRB d mpfr_inf_p /= 0 +isInfinite (MP _ _ e _) = e == expInf -- withMPFRB d mpfr_inf_p /= 0 isNumber :: MPFR -> Bool isNumber d = withMPFRB d mpfr_number_p /= 0 isZero :: MPFR -> Bool-isZero d = withMPFRB d mpfr_zero_p /= 0+isZero (MP _ _ e _) = e == expZero --withMPFRB d mpfr_zero_p /= 0 sgn :: MPFR -> Maybe Int sgn mp1 = case (cmpw mp1 0) of
Data/Number/MPFR/Conversion.hs view
@@ -76,7 +76,12 @@ -- TODO decompose :: MPFR -> (Integer, Exp)-decompose d = (getMantissa d, getExp d - fromIntegral (Prelude.ceiling (fromIntegral (getPrec d) / fromIntegral bitsPerMPLimb :: Double) * bitsPerMPLimb))+decompose d@(MP p _ e _) | e == expInf = error "Don't know how to decompose Infinity"+ | e == expNaN = error "Don't know how to decompose NaN"+ | e == expZero = (0, 0) + | otherwise = (dm, e - sh)+ where dm = getMantissa d+ sh = fromIntegral (Prelude.ceiling (fromIntegral p / fromIntegral bitsPerMPLimb :: Double) * bitsPerMPLimb) -- | Output a string in base 10 rounded to Near in exponential form. toStringExp :: Word -- ^ number of digits
Data/Number/MPFR/FFIhelper.hsc view
@@ -25,7 +25,7 @@ fromEnum Up = #{const GMP_RNDU} fromEnum Down = #{const GMP_RNDD} fromEnum GMP_RND_MAX = #{const GMP_RND_MAX}- fromEnum GMP_RNDNA = #{const GMP_RNDNA}+ fromEnum GMP_RNDNA = #{const GMP_RNDNA} toEnum #{const GMP_RNDN} = Near toEnum #{const GMP_RNDZ} = Zero@@ -36,10 +36,10 @@ toEnum i = error $ "RoundMode.toEnum called with illegal argument :" ++ show i -data MPFR = MP { precision :: !CPrecision,- sign :: !Sign,- exponent :: !Exp,- limbs :: !(ForeignPtr Limb)+data MPFR = MP { precision :: {-# UNPACK #-} !CPrecision,+ sign :: {-# UNPACK #-} !Sign,+ exponent :: {-# UNPACK #-} !Exp,+ limbs :: {-# UNPACK #-} !(ForeignPtr Limb) } deriving (Typeable) instance Storable MPFR where@@ -53,8 +53,8 @@ {-# INLINE peekP #-} peekP :: Ptr MPFR -> ForeignPtr Limb -> IO MPFR peekP p fp = do r11 <- #{peek __mpfr_struct, _mpfr_prec} p- r21 <- #{peek __mpfr_struct, _mpfr_sign} p- r22 <- #{peek __mpfr_struct, _mpfr_exp} p+ r21 <- #{peek __mpfr_struct, _mpfr_sign} p+ r22 <- #{peek __mpfr_struct, _mpfr_exp} p return (MP r11 r21 r22 fp) {-# INLINE withDummy #-} withDummy :: Word -> (Ptr MPFR -> IO CInt) -> IO (MPFR, Int)@@ -69,6 +69,7 @@ r1 <- peekP ptr fp return (r1, fromIntegral r2) +{-# INLINE pokeDummy #-} pokeDummy :: Ptr MPFR -> ForeignPtr Limb -> Word -> IO () pokeDummy ptr fp p = do #{poke __mpfr_struct, _mpfr_prec} ptr (fromIntegral p :: CPrecision) #{poke __mpfr_struct, _mpfr_sign} ptr (0 :: Sign) @@ -77,6 +78,16 @@ bitsPerMPLimb :: Int bitsPerMPLimb = 8 * #size mp_limb_t++expZero :: Exp+expZero = #const __MPFR_EXP_ZERO++expNaN :: Exp+expNaN = #const __MPFR_EXP_NAN++expInf :: Exp+expInf = #const __MPFR_EXP_INF+ type CRoundMode = CInt
Data/Number/MPFR/Internal.hs view
@@ -54,8 +54,8 @@ -> (Ptr MPFR -> Ptr MPFR -> CLong -> CRoundMode -> IO CInt) -> (MPFR, Int) withMPFRBAsi r p !mp1 d f = unsafePerformIO go - where go = do withDummy p $ \p1 -> do- with mp1 $ \p2 -> do+ where go = do withDummy p $ \ p1 -> do+ with mp1 $ \ p2 -> do f p1 p2 d ((fromIntegral . fromEnum) r) {-# INLINE withMPFRBAiu #-}@@ -78,11 +78,11 @@ {-# INLINE withMPFRB #-} withMPFRB :: MPFR -> (Ptr MPFR -> IO CInt) -> CInt -withMPFRB mp1 !f = unsafePerformIO go+withMPFRB !mp1 f = unsafePerformIO go where go = with mp1 $ \p1 -> f p1 withMPFRP :: MPFR -> (Ptr MPFR -> IO CPrecision) -> CPrecision -withMPFRP mp1 !f = unsafePerformIO go+withMPFRP !mp1 f = unsafePerformIO go where go = with mp1 $ \p1 -> f p1 {-# INLINE withMPFR #-}@@ -98,7 +98,7 @@ withMPFRBB :: MPFR -> MPFR -> (Ptr MPFR -> Ptr MPFR -> IO CInt) -> CInt -withMPFRBB mp1 mp2 f = unsafePerformIO go+withMPFRBB !mp1 !mp2 f = unsafePerformIO go where go = do with mp1 $ \p1 -> do with mp2 $ \p2 -> do f p1 p2@@ -128,7 +128,7 @@ withMPFRR :: Precision -> MPFR -> (Ptr MPFR -> Ptr MPFR -> IO CInt) -> (MPFR, Int)-withMPFRR p d f = unsafePerformIO go+withMPFRR p !d f = unsafePerformIO go where go = do withDummy p $ \p1 -> do with d $ \p2 -> do f p1 p2
Data/Number/MPFR/Misc.hs view
@@ -19,6 +19,7 @@ import Data.Number.MPFR.Assignment +import Data.List(foldl') nextToward :: MPFR -> MPFR -> MPFR nextToward mp1 mp2 = unsafePerformIO go@@ -98,14 +99,19 @@ minD_ r p d1 d2 = withMPFRsBA r p d1 d2 mpfr_min getPrec :: MPFR -> Precision-getPrec d = fromIntegral (withMPFRP d mpfr_get_prec)+getPrec (MP p _ _ _) = fromIntegral p -- fromIntegral (withMPFRP d mpfr_get_prec) -- | getMantissa and getExp return values such that ----- > d = getMantissa d * 2^(getExp d - Prelude.ceiling ((getPrec d) / bitsPerMPLimb)* bitsPerMPLimb )+-- > d = getMantissa d * 2^(getExp d - ceiling ((getPrec d) / bitsPerMPLimb)* bitsPerMPLimb )+--+-- If case of 0, NaN or +-Inf it will return 0 getMantissa :: MPFR -> Integer-getMantissa d = toInteger (sign d) * h- where (h, _) = foldl (\(a,b) c -> (a + (toInteger c) `shiftL` b, b + bitsPerMPLimb)) (0,0) (getMantissa' d) +getMantissa d@(MP _ s e _) | e /= expInf && e /= expNaN && e /= expZero = toInteger s * h+ | otherwise = 0+ where (h, _) = foldl' (\(a,b) c ->+ (a + (toInteger c) `shiftL` b, b + bitsPerMPLimb))+ (0,0) (getMantissa' d) one :: MPFR one = fromWord Near minPrec 1
hmpfr.cabal view
@@ -1,5 +1,5 @@ name: hmpfr-version: 0.1.1+version: 0.1.2 synopsis: Haskell binding to MPFR library description: Haskell binding to MPFR library. Tested with MPFR 2.3.1 and 2.3.2. Some simple examples of usage can be found in test/Demo.hs.@@ -7,7 +7,7 @@ license: BSD3 license-file: LICENSE Stability: experimental-tested-with: GHC == 6.8.2 GHC == 6.8.3+tested-with: GHC == 6.8.3 author: Aleš Bizjak maintainer: Aleš Bizjak <ales.bizjak0@gmail.com> Homepage: http://code.haskell.org/hmpfr/@@ -39,7 +39,7 @@ build-type: Simple build-tools: hsc2hs-GHC-options: -Wall -fno-warn-orphans -O2 -fvia-C -optc-O2+GHC-options: -Wall -fno-warn-orphans -O2 -funfolding-keeness-factor=10 -fvia-C -optc-O2 GHC-prof-options: -prof -auto-all include-dirs: cbits includes: chsmpfr.h mpfr.h
test/Demo.hs view
@@ -1,6 +1,6 @@ module Demo where -import qualified Data.Number.MPFR as M+import qualified Data.Number.MPFR.Up as M -- compute the sum from 1 to n with precision of p bits rounded to Near s :: M.Precision -> Int -> M.MPFR@@ -10,6 +10,9 @@ s' :: M.Precision -> Int -> M.MPFR s' p = foldl (M.addi M.Near p) 0 . enumFromTo 1++s'' :: M.Precision -> Int -> M.MPFR+s'' p = foldl ((. M.fromInt M.Up p) . (+)) M.zero . enumFromTo 1 -- compute pi with precision of n bits pi' n = M.pi M.Near n