{-# LANGUAGE ForeignFunctionInterface, DeriveDataTypeable, GeneralizedNewtypeDeriving #-} #include #include module Data.Number.MPFR.FFIhelper where import Data.Word import Data.Int import Foreign.C.String(CString) #if (__GLASGOW_HASKELL__ >= 704) import Foreign.C.Types(CULong(..), CLong(..), CInt(..), CUInt(..), CDouble(..), CChar) #else import Foreign.C.Types(CULong, CLong, CInt, CUInt, CDouble, CChar) #endif import Foreign.Ptr(Ptr) import Foreign.Marshal(alloca) import Foreign.Storable import Foreign.ForeignPtr (ForeignPtr, withForeignPtr, mallocForeignPtrBytes) import Data.Typeable(Typeable) import Data.Function(on) data RoundMode = Near | Zero | Up | Down | MPFR_RNDNA deriving (Show, Read) instance Enum RoundMode where #if MPFR_VERSION_MAJOR == 2 fromEnum Near = #{const GMP_RNDN} fromEnum Zero = #{const GMP_RNDZ} fromEnum Up = #{const GMP_RNDU} fromEnum Down = #{const GMP_RNDD} fromEnum MPFR_RNDNA = #{const GMP_RNDNA} toEnum #{const GMP_RNDN} = Near toEnum #{const GMP_RNDZ} = Zero toEnum #{const GMP_RNDU} = Up toEnum #{const GMP_RNDD} = Down toEnum (#{const GMP_RNDNA}) = MPFR_RNDNA #else fromEnum Near = #{const MPFR_RNDN} fromEnum Zero = #{const MPFR_RNDZ} fromEnum Up = #{const MPFR_RNDU} fromEnum Down = #{const MPFR_RNDD} fromEnum MPFR_RNDNA = #{const MPFR_RNDNA} toEnum #{const MPFR_RNDN} = Near toEnum #{const MPFR_RNDZ} = Zero toEnum #{const MPFR_RNDU} = Up toEnum #{const MPFR_RNDD} = Down toEnum (#{const MPFR_RNDNA}) = MPFR_RNDNA #endif toEnum i = error $ "RoundMode.toEnum called with illegal argument :" ++ show i data MPFR = MP { precision :: {-# UNPACK #-} !CPrecision, sign :: {-# UNPACK #-} !Sign, exponent :: {-# UNPACK #-} !Exp, limbs :: {-# UNPACK #-} !(ForeignPtr Limb) } deriving (Typeable) instance Storable MPFR where sizeOf _ = #size __mpfr_struct alignment _ = alignment (undefined :: #{type mpfr_prec_t}) peek = error "MPFR.peek: Not needed and not applicable" poke p (MP prec s e fp) = do #{poke __mpfr_struct, _mpfr_prec} p prec #{poke __mpfr_struct, _mpfr_sign} p s #{poke __mpfr_struct, _mpfr_exp} p e withForeignPtr fp $ \p1 -> #{poke __mpfr_struct, _mpfr_d} p p1 newtype Precision = Precision { runPrec :: Word } deriving (Eq, Ord, Show, Enum) instance Num Precision where (Precision w) + (Precision w') = Precision $ w + w' (Precision w) * (Precision w') = Precision $ w * w' (Precision a) - (Precision b) = if a >= b then Precision (a - b) else error $ "instance Precision Num (-): " ++ "Operation would result in negative precision." negate = error $ "instance Precision Num negate: " ++ "operation would result in negative precision" abs = id signum (Precision x) = Precision . signum $ x fromInteger i = if i >= 0 then Precision . fromInteger $ i else error $ "instance Precision Num fromInteger: " ++ "operation would result in negative precision" instance Real Precision where toRational (Precision w) = toRational w instance Integral Precision where quotRem (Precision w) (Precision w') = uncurry ((,) `on` Precision) $ quotRem w w' toInteger (Precision w) = toInteger w {-# INLINE peekNoLimbPrec #-} peekNoLimbPrec :: Ptr MPFR -> IO (Sign, Exp) peekNoLimbPrec p = do r21 <- #{peek __mpfr_struct, _mpfr_sign} p r22 <- #{peek __mpfr_struct, _mpfr_exp} p return (r21, r22) {-# 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 return (MP r11 r21 r22 fp) {-# INLINE withDummy #-} withDummy :: Precision -> (Ptr MPFR -> IO CInt) -> IO (MPFR, Int) withDummy w f = do alloca $ \ptr -> do ls <- mpfr_custom_get_size (fromIntegral . runPrec $ w) fp <- mallocForeignPtrBytes (fromIntegral ls) #{poke __mpfr_struct, _mpfr_prec} ptr (fromIntegral w :: CPrecision) #{poke __mpfr_struct, _mpfr_sign} ptr (1 :: Sign) #{poke __mpfr_struct, _mpfr_exp} ptr (0 :: Exp) withForeignPtr fp $ \p1 -> #{poke __mpfr_struct, _mpfr_d} ptr p1 r2 <- f ptr r1 <- peekP ptr fp return (r1, fromIntegral r2) {-# INLINE pokeDummy #-} pokeDummy :: Ptr MPFR -> ForeignPtr Limb -> Precision -> IO () pokeDummy ptr fp p = do #{poke __mpfr_struct, _mpfr_prec} ptr ((fromIntegral . runPrec $ p) :: CPrecision) #{poke __mpfr_struct, _mpfr_sign} ptr (0 :: Sign) #{poke __mpfr_struct, _mpfr_exp} ptr (0 :: Exp) withForeignPtr fp $ \p1 -> #{poke __mpfr_struct, _mpfr_d} ptr p1 bitsPerMPLimb :: Int bitsPerMPLimb = 8 * #size mp_limb_t bitsPerIntegerLimb :: Int bitsPerIntegerLimb = bitsPerMPLimb expZero :: Exp expZero = #const __MPFR_EXP_ZERO expNaN :: Exp expNaN = #const __MPFR_EXP_NAN expInf :: Exp expInf = #const __MPFR_EXP_INF type CRoundMode = CInt type Limb = #type mp_limb_t type Sign = #type mpfr_sign_t type CPrecision = #type mpfr_prec_t type Exp = #type mp_exp_t type MpSize = #type mp_size_t -- utility functions from chsmpfr.h foreign import ccall unsafe "initS" initS :: CPrecision -> IO (Ptr MPFR) foreign import ccall unsafe "new_gmp_randstate" new_gmp_randstate :: IO (Ptr GmpRandState) foreign import ccall unsafe "mpfr_urandomb_deref_randstate" mpfr_urandomb_deref_randstate :: (Ptr MPFR) -> (Ptr GmpRandState) -> IO Int type GmpRandState = () -------------------- foreign import ccall unsafe "mpfr_get_prec_wrap" mpfr_get_prec :: Ptr MPFR -> IO CPrecision ---------------------------------------------------------------- -- assignment functions foreign import ccall unsafe "mpfr_set_wrap" mpfr_set :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_set_ui_wrap" mpfr_set_ui :: Ptr MPFR -> CULong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_set_si_wrap" mpfr_set_si :: Ptr MPFR -> CLong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_set_d" mpfr_set_d :: Ptr MPFR -> CDouble -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_set_ui_2exp" mpfr_set_ui_2exp :: Ptr MPFR -> CULong -> Exp -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_set_si_2exp" mpfr_set_si_2exp :: Ptr MPFR -> CLong -> Exp -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_set_str" mpfr_set_str :: Ptr MPFR -> CString -> CInt -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_strtofr" mpfr_strtofr :: Ptr MPFR -> CString -> Ptr (Ptr CChar) -> CInt -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_set_inf" mpfr_set_inf :: Ptr MPFR -> CInt -> IO () foreign import ccall unsafe "mpfr_set_nan" mpfr_set_nan :: Ptr MPFR -> IO () foreign import ccall unsafe "mpfr_swap" mpfr_swap :: Ptr MPFR -> Ptr MPFR -> IO () -------------------------------------------------------------------------------- -- conversion functions foreign import ccall unsafe "mpfr_get_d" mpfr_get_d :: Ptr MPFR -> CRoundMode -> IO CDouble foreign import ccall unsafe "mpfr_get_d_2exp" mpfr_get_d_2exp :: Ptr CLong -> Ptr MPFR -> CRoundMode -> IO CDouble -- !!!!!!! next 4 set erange flags foreign import ccall unsafe "mpfr_get_si" mpfr_get_si :: Ptr MPFR -> CRoundMode -> IO CLong foreign import ccall unsafe "mpfr_get_ui" mpfr_get_ui :: Ptr MPFR -> CRoundMode -> IO CULong foreign import ccall unsafe "mpfr_get_str" mpfr_get_str :: CString -> Ptr Exp -> CInt -> CUInt -> Ptr MPFR -> CRoundMode -> IO CString foreign import ccall unsafe "mpfr_free_str" mpfr_free_str :: CString -> IO () foreign import ccall unsafe "mpfr_fits_ulong_p" mpfr_fits_ulong_p :: Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_fits_slong_p" mpfr_fits_slong_p :: Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_fits_uint_p" mpfr_fits_uint_p :: Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_fits_sint_p" mpfr_fits_sint_p :: Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_fits_ushort_p" mpfr_fits_ushort_p :: Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_fits_sshort_p" mpfr_fits_sshort_p :: Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_fits_intmax_p" mpfr_fits_intmax_p :: Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_fits_uintmax_p" mpfr_fits_uintmax_p :: Ptr MPFR -> CRoundMode -> IO CInt ------------------------------------------------------------------------------- -- basic arithmetic functions foreign import ccall unsafe "mpfr_add" mpfr_add :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_add_ui" mpfr_add_ui :: Ptr MPFR -> Ptr MPFR -> CULong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_add_si" mpfr_add_si :: Ptr MPFR -> Ptr MPFR -> CLong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_add_d" mpfr_add_d :: Ptr MPFR -> Ptr MPFR -> CDouble -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_sub" mpfr_sub :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_ui_sub" mpfr_ui_sub :: Ptr MPFR -> CULong -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_sub_ui" mpfr_sub_ui :: Ptr MPFR -> Ptr MPFR -> CULong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_si_sub" mpfr_si_sub :: Ptr MPFR -> CLong -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_sub_si" mpfr_sub_si :: Ptr MPFR -> Ptr MPFR -> CLong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_sub_d" mpfr_sub_d :: Ptr MPFR -> Ptr MPFR -> CDouble -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_d_sub" mpfr_d_sub :: Ptr MPFR -> CDouble -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_mul" mpfr_mul :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_mul_ui" mpfr_mul_ui :: Ptr MPFR -> Ptr MPFR -> CULong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_mul_si" mpfr_mul_si :: Ptr MPFR -> Ptr MPFR -> CLong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_mul_d" mpfr_mul_d:: Ptr MPFR -> Ptr MPFR -> CDouble -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_sqr" mpfr_sqr :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_div" mpfr_div :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_ui_div" mpfr_ui_div :: Ptr MPFR -> CULong -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_div_ui" mpfr_div_ui :: Ptr MPFR -> Ptr MPFR -> CULong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_si_div" mpfr_si_div :: Ptr MPFR -> CLong -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_div_si" mpfr_div_si :: Ptr MPFR -> Ptr MPFR -> CLong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_div_d" mpfr_div_d :: Ptr MPFR -> Ptr MPFR -> CDouble -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_d_div" mpfr_d_div :: Ptr MPFR -> CDouble -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_sqrt" mpfr_sqrt :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_sqrt_ui" mpfr_sqrt_ui :: Ptr MPFR -> CULong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_rec_sqrt" mpfr_rec_sqrt :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_cbrt" mpfr_cbrt :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_root" mpfr_root :: Ptr MPFR -> Ptr MPFR -> CULong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_pow" mpfr_pow :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_pow_ui" mpfr_pow_ui :: Ptr MPFR -> Ptr MPFR -> CULong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_pow_si" mpfr_pow_si :: Ptr MPFR -> Ptr MPFR -> CLong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_ui_pow_ui" mpfr_ui_pow_ui :: Ptr MPFR -> CULong -> CULong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_ui_pow" mpfr_ui_pow :: Ptr MPFR -> CULong -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_neg" mpfr_neg :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_abs_wrap" mpfr_abs :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_dim" mpfr_dim :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_mul_2ui" mpfr_mul_2ui :: Ptr MPFR -> Ptr MPFR -> CULong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_mul_2si" mpfr_mul_2si :: Ptr MPFR -> Ptr MPFR -> CLong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_div_2ui" mpfr_div_2ui :: Ptr MPFR -> Ptr MPFR -> CULong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_div_2si" mpfr_div_2si :: Ptr MPFR -> Ptr MPFR -> CLong -> CRoundMode -> IO CInt -------------------------------------------------------------------------------- -- comparison functions -- !!!!!!!! these set erange flags foreign import ccall unsafe "mpfr_cmp_wrap" mpfr_cmp :: Ptr MPFR -> Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_cmp_ui_wrap" mpfr_cmp_ui :: Ptr MPFR -> CULong -> IO CInt foreign import ccall unsafe "mpfr_cmp_si_wrap" mpfr_cmp_si :: Ptr MPFR -> CLong -> IO CInt foreign import ccall unsafe "mpfr_cmp_d" mpfr_cmp_d :: Ptr MPFR -> CDouble -> IO CInt foreign import ccall unsafe "mpfr_cmp_ui_2exp" mpfr_cmp_ui_2exp :: Ptr MPFR -> CULong -> Exp -> IO CInt foreign import ccall unsafe "mpfr_cmp_si_2exp" mpfr_cmp_si_2exp :: Ptr MPFR -> CLong -> Exp -> IO CInt foreign import ccall unsafe "mpfr_cmpabs" mpfr_cmpabs :: Ptr MPFR -> Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_nan_p_wrap" mpfr_nan_p :: Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_inf_p_wrap" mpfr_inf_p :: Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_number_p" mpfr_number_p :: Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_zero_p_wrap" mpfr_zero_p :: Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_sgn_wrap" mpfr_sgn :: Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_greater_p" mpfr_greater_p :: Ptr MPFR -> Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_greaterequal_p" mpfr_greaterequal_p :: Ptr MPFR -> Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_less_p" mpfr_less_p :: Ptr MPFR -> Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_lessequal_p" mpfr_lessequal_p :: Ptr MPFR -> Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_lessgreater_p" mpfr_lessgreater_p :: Ptr MPFR -> Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_equal_p" mpfr_equal_p :: Ptr MPFR -> Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_unordered_p" mpfr_unordered_p :: Ptr MPFR -> Ptr MPFR -> IO CInt -- special functions foreign import ccall unsafe "mpfr_log" mpfr_log :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_log2" mpfr_log2 :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_log10" mpfr_log10 :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_exp" mpfr_exp :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_exp2" mpfr_exp2 :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_exp10" mpfr_exp10 :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_sin" mpfr_sin :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_cos" mpfr_cos :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_tan" mpfr_tan :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_sec" mpfr_sec :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_csc" mpfr_csc :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_cot" mpfr_cot :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_sin_cos" mpfr_sin_cos :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_asin" mpfr_asin :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_acos" mpfr_acos :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_atan" mpfr_atan :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_atan2" mpfr_atan2 :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_cosh" mpfr_cosh :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_sinh" mpfr_sinh :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_tanh" mpfr_tanh :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_sinh_cosh" mpfr_sinh_cosh :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_sech" mpfr_sech :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_csch" mpfr_csch :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_coth" mpfr_coth :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_asinh" mpfr_asinh :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_acosh" mpfr_acosh :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_atanh" mpfr_atanh :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_fac_ui" mpfr_fac_ui :: Ptr MPFR -> CULong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_log1p" mpfr_log1p :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_expm1" mpfr_expm1 :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_li2" mpfr_li2 :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_eint" mpfr_eint :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_gamma" mpfr_gamma :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_lngamma" mpfr_lngamma :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_lgamma" mpfr_lgamma :: Ptr MPFR -> Ptr CInt -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_zeta" mpfr_zeta :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_zeta_ui" mpfr_zeta_ui :: Ptr MPFR -> CULong -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_erf" mpfr_erf :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_erfc" mpfr_erfc :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_j0" mpfr_j0 :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_j1" mpfr_j1 :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_jn" mpfr_jn :: Ptr MPFR -> CLong -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_y0" mpfr_y0 :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_y1" mpfr_y1 :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_yn" mpfr_yn :: Ptr MPFR -> CLong -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_fma" mpfr_fma :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_fms" mpfr_fms :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_agm" mpfr_agm :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_hypot" mpfr_hypot :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt -- constants foreign import ccall unsafe "mpfr_const_log2_wrap" mpfr_const_log2 :: Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_const_pi_wrap" mpfr_const_pi :: Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_const_euler_wrap" mpfr_const_euler :: Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_const_catalan_wrap" mpfr_const_catalan :: Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_free_cache" mpfr_free_cache :: IO () foreign import ccall unsafe "mpfr_sum" mpfr_sum :: Ptr MPFR -> Ptr (Ptr MPFR) -> CULong -> CRoundMode -> IO CInt -- TODO input and output functions -- integer related functions foreign import ccall unsafe "mpfr_rint" mpfr_rint :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_ceil_wrap" mpfr_ceil :: Ptr MPFR -> Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_floor_wrap" mpfr_floor :: Ptr MPFR -> Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_round_wrap" mpfr_round :: Ptr MPFR -> Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_trunc_wrap" mpfr_trunc :: Ptr MPFR -> Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_rint_ceil" mpfr_rint_ceil :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_rint_floor" mpfr_rint_floor :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_rint_round" mpfr_rint_round :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_rint_trunc" mpfr_rint_trunc :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_frac" mpfr_frac :: Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_modf" mpfr_modf :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_fmod" mpfr_fmod :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_remainder" mpfr_remainder :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_remquo" mpfr_remquo :: Ptr MPFR -> Ptr CLong -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_integer_p" mpfr_integer_p :: Ptr MPFR -> IO CInt -------------------- -- miscellaneus functions foreign import ccall unsafe "mpfr_nexttoward" mpfr_nexttoward :: Ptr MPFR -> Ptr MPFR -> IO () foreign import ccall unsafe "mpfr_nextabove" mpfr_nextabove :: Ptr MPFR -> IO () foreign import ccall unsafe "mpfr_nextbelow" mpfr_nextbelow :: Ptr MPFR -> IO () foreign import ccall unsafe "mpfr_min" mpfr_min :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_max" mpfr_max :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_urandomb" mpfr_urandomb :: Ptr MPFR -> Ptr GmpRandState -> IO () foreign import ccall unsafe "mpfr_get_exp_wrap" mpfr_get_exp :: Ptr MPFR -> IO Exp foreign import ccall unsafe "mpfr_set_exp" mpfr_set_exp :: Ptr MPFR -> Exp -> IO CInt foreign import ccall unsafe "mpfr_signbit_wrap" mpfr_signbit :: Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_setsign_wrap" mpfr_setsign :: Ptr MPFR -> Ptr MPFR -> CInt -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_copysign_wrap" mpfr_copysign :: Ptr MPFR -> Ptr MPFR -> Ptr MPFR -> CRoundMode -> IO CInt --------------------------------------------------------------- -- rounding mode related functions foreign import ccall unsafe "mpfr_get_emin" mpfr_get_emin :: IO Exp foreign import ccall unsafe "mpfr_get_emax" mpfr_get_emax :: IO Exp foreign import ccall unsafe "mpfr_set_emin" mpfr_set_emin :: Exp -> IO CInt foreign import ccall unsafe "mpfr_set_emax" mpfr_set_emax :: Exp -> IO CInt foreign import ccall unsafe "mpfr_get_emin_min" mpfr_get_emin_min :: IO Exp foreign import ccall unsafe "mpfr_get_emin_max" mpfr_get_emin_max :: IO Exp foreign import ccall unsafe "mpfr_get_emax_min" mpfr_get_emax_min :: IO Exp foreign import ccall unsafe "mpfr_get_emax_max" mpfr_get_emax_max :: IO Exp foreign import ccall unsafe "mpfr_check_range" mpfr_check_range :: Ptr MPFR -> CInt -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_subnormalize" mpfr_subnormalize :: Ptr MPFR -> CInt -> CRoundMode -> IO CInt foreign import ccall unsafe "mpfr_clear_underflow" mpfr_clear_underflow :: IO () foreign import ccall unsafe "mpfr_clear_overflow" mpfr_clear_overflow :: IO () foreign import ccall unsafe "mpfr_clear_nanflag" mpfr_clear_nanflag :: IO () foreign import ccall unsafe "mpfr_clear_inexflag" mpfr_clear_inexflag :: IO () foreign import ccall unsafe "mpfr_clear_erangeflag" mpfr_clear_erangeflag :: IO () foreign import ccall unsafe "mpfr_set_underflow" mpfr_set_underflow :: IO () foreign import ccall unsafe "mpfr_set_overflow" mpfr_set_overflow :: IO () foreign import ccall unsafe "mpfr_set_nanflag" mpfr_set_nanflag :: IO () foreign import ccall unsafe "mpfr_set_inexflag" mpfr_set_inexflag :: IO () foreign import ccall unsafe "mpfr_set_erangeflag" mpfr_set_erangeflag :: IO () foreign import ccall unsafe "mpfr_clear_flags" mpfr_clear_flags :: IO () foreign import ccall unsafe "mpfr_underflow_p" mpfr_underflow_p :: IO CInt foreign import ccall unsafe "mpfr_overflow_p" mpfr_overflow_p :: IO CInt foreign import ccall unsafe "mpfr_nanflag_p" mpfr_nanflag_p :: IO CInt foreign import ccall unsafe "mpfr_inexflag_p" mpfr_inexflag_p :: IO CInt foreign import ccall unsafe "mpfr_erangeflag_p" mpfr_erangeflag_p :: IO CInt --------------------------------------------------------------- -- custom interface foreign import ccall unsafe "mpfr_custom_get_size_wrap" mpfr_custom_get_size :: CPrecision -> IO #{type size_t} foreign import ccall unsafe "mpfr_custom_init_wrap" mpfr_custom_init :: Ptr #{type mp_limb_t} -> CPrecision -> IO () foreign import ccall unsafe "mpfr_custom_init_set_wrap" mpfr_custom_init_set :: Ptr MPFR -> CInt -> Exp -> CPrecision -> Ptr Limb -> IO () foreign import ccall unsafe "mpfr_custom_get_kind_wrap" mpfr_custom_get_kind :: Ptr MPFR -> IO CInt foreign import ccall unsafe "mpfr_custom_get_mantissa_wrap" mpfr_custom_get_mantissa :: Ptr MPFR -> IO (Ptr Limb) foreign import ccall unsafe "mpfr_custom_get_exp_wrap" mpfr_custom_get_exp :: Ptr MPFR -> IO Exp foreign import ccall unsafe "mpfr_custom_move_wrap" mpfr_custom_move :: Ptr MPFR -> Ptr #{type mp_limb_t} -> IO () -------------------------------------------------