packages feed

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

import System.TimeIt

import Foreign.Ptr (nullPtr)
import Foreign.C.Types

import Options.Applicative
import Control.Monad

import Data.Number.Flint.Arb

main = timeItNamed "time"
     $ run =<< customExecParser (prefs showHelpOnEmpty) opts where
  opts = info (parameters <**> helper) (
         fullDesc
      <> progDesc "Calculates digits of pi."
      <> header "Calculates digits of pi.")

run (Parameters digits condense) = do
  let prec = floor $ fromIntegral digits / logBase 10 2 + 5
      flag = foldr (+) arb_str_none $
                   replicate condense arb_str_condense
  putStrLn $ "computing pi with a precision of " ++ show prec ++ " bits ..."
  withNewArb $ \x -> do
    arb_const_pi x prec
    arb_printn x (fromIntegral digits) flag
    putStr "\n"
    
data Parameters = Parameters {
  digits :: Int,
  condense :: Int
} deriving Show

parameters :: Parser Parameters
parameters = Parameters
  <$> argument auto (
    help "number of digits to calculate." <>
    metavar "digits")
  <*> argument auto (
    value 20 <>
    help "condense" <>
    showDefault <>
    metavar "condense")