packages feed

compensated-0.8.1: benchmarks/criterion.hs

{-# LANGUAGE RankNTypes #-}
import Criterion.Main

import Numeric.Compensated

class Square a where sqr :: a -> a
instance Square Float where sqr x = x * x
instance Square Double where sqr x = x * x
instance Compensable a => Square (Compensated a) where sqr = square

group :: String -> (forall a . (Floating a, Square a) => a -> a) -> Benchmark
group name f = bgroup name
  [ bench "Float" $ whnf f (0.2 :: Float)
  , bench "Double" $ whnf f (0.2 :: Double)
  , bench "Compensated Float" $ whnf f (0.2 :: Compensated Float)
  , bench "Compensated Double" $ whnf f (0.2 :: Compensated Double)
  , bench "Overcompensated Float" $ whnf f (0.2 :: Overcompensated Float)
  , bench "Overcompensated Double" $ whnf f (0.2 :: Overcompensated Double)
  ]

main :: IO ()
main = defaultMain
  [ group "(+)" (0.1 +)
  , group "(-)" (0.1 -)
  , group "(*)" (0.1 *)
  , group "negate" $ negate
  , group "square" $ sqr
  , group "(/)" $ (0.1 /)
  , group "recip" $ recip
  , group "sqrt" $ sqrt
  ]