packages feed

Flint2-Examples-0.1.0.0: app/fpwrap/Main.hs

{-# 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)