packages feed

exact-real-0.3.0.0: test/Data/CReal/Extra.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}

module Data.CReal.Extra
  ( module Data.CReal
  ) where

import Data.CReal
import Data.CReal.Internal (log2)
import Data.Ratio ((%))
import GHC.TypeLits
import System.Random (Random(..))
import Test.QuickCheck (Arbitrary(..), choose)
import Test.QuickCheck.Checkers (EqProp(..), eq)

instance KnownNat n => EqProp (CReal n) where
  (=-=) = eq

instance KnownNat n => Arbitrary (CReal n) where
  arbitrary = do
    integralPart <- fromInteger <$> arbitrary
    fractionalPart <- choose (-0.5, 0.5)
    pure (integralPart + fractionalPart)

instance KnownNat n => Random (CReal n) where
  randomR (lo, hi) g = let d = hi - lo
                           l = 1 + log2 (abs d `atPrecision` 0)
                           p = l + crealPrecision lo
                           (n, g') = randomR (0, 2^p) g
                           r = fromRational (n % 2^p)
                       in (r * d + lo, g')
  random = randomR (0, 1)