{-# language FlexibleInstances #-} import System.IO.Unsafe import Foreign.C.Types import Foreign.Marshal.Alloc import Foreign.Storable import Text.Printf import Data.Complex import Data.Number.Flint hiding (magnitude, phase, realPart, imagPart) main = do let x = 2.0 :: Double fx = zeta x z = 0.5 :+ 123.0 :: Complex Double fz = zeta z printf "zeta(%g) = %.16g\n" x fx printf "zeta(%g + %gi) = %.16g + %.16gi\n" (realPart z ) (imagPart z ) (realPart fz) (imagPart fz) -- implement instances for zeta for Double and Complex Double ------------------ instance Special Double where zeta x = unsafePerformIO $ do alloca $ \f -> do flag <- arb_fpwrap_double_zeta f (realToFrac x) 0 result <- peek f return $ realToFrac $ result instance Special (Complex Double) where zeta z = unsafePerformIO $ do alloca $ \f -> do alloca $ \zp -> do poke zp ((realToFrac.realPart) z :+ (realToFrac.imagPart) z) flag <- arb_fpwrap_cdouble_zeta f zp 0 result <- peek f return $ ((realToFrac.realPart) result :+ (realToFrac.imagPart) result)