-- | Approximate and exact limits around 0 and towards transfinite numbers.

module Numeric.Limits where



-- | The class of limits into the transfinite.

class NumericLimits x where
  -- "A" minimal finite number that can still be worked with. (And should not
  -- trip the CPU transfinite number handling)
  minFinite  x
  -- "A" maximal finite number.
  maxFinite  x

-- | The smallest value @/= 0@ for numeric values.

class NumericEpsilon x where
  -- | Numeric epsilon.
  epsilon  x



instance NumericLimits Word where
  minFinite :: Word
minFinite = Word
forall a. Bounded a => a
minBound Word -> Word -> Word
forall a. Integral a => a -> a -> a
`div` Word
100000
  maxFinite :: Word
maxFinite = Word
forall a. Bounded a => a
maxBound Word -> Word -> Word
forall a. Integral a => a -> a -> a
`div` Word
100000
  {-# Inline minFinite #-}
  {-# Inline maxFinite #-}

instance NumericLimits Int where
  minFinite :: Int
minFinite = Int
forall a. Bounded a => a
minBound Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
100000
  maxFinite :: Int
maxFinite = Int
forall a. Bounded a => a
maxBound Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
100000
  {-# Inline minFinite #-}
  {-# Inline maxFinite #-}

instance NumericLimits Double where
  minFinite :: Double
minFinite = -Double
1.79e308
  maxFinite :: Double
maxFinite =  Double
1.79e308
  {-# Inline minFinite #-}
  {-# Inline maxFinite #-}

instance NumericEpsilon Double where
  epsilon :: Double
epsilon = Double
2.2e-16
  {-# Inline epsilon #-}