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)