module Data.Epsilon
( MkEpsilon (..)
, aboutEqual
, isApproxId
, module Linear.Epsilon
) where
import Foreign.C.Types (CFloat, CDouble)
import Linear.Epsilon
-- | Provides a near-zero quantity
class MkEpsilon a where
-- | A near-zero quantity
epsilon :: a
-- | ε = 1e-6
instance MkEpsilon Float where
epsilon = 1e-6
-- | ε = 1e-12
instance MkEpsilon Double where
epsilon = 1e-12
-- | ε = 1e-6
instance MkEpsilon CFloat where
epsilon = 1e-6
-- | ε = 1e-12
instance MkEpsilon CDouble where
epsilon = 1e-12
-- | Equality up to epsilon
--
-- @'aboutEqual' a b@ is true iff @|a - b| < ε@
aboutEqual :: Epsilon a => a -> a -> Bool
aboutEqual a b = nearZero (a - b)
isApproxId :: Epsilon a => (a -> a) -> a -> Bool
isApproxId f a = aboutEqual (f a) a