module Gamgine.Math.Utils where clamp :: Double -> Double -> Double -> Double clamp min max value | value < min = min | value > max = max | otherwise = value flipSign :: Double -> Double flipSign num = -1 * signum num maxFloat :: RealFloat a => a -> a maxFloat a = encodeFloat m n where b = floatRadix a e = floatDigits a (_, e') = floatRange a m = b ^ e - 1 n = e' - e instance Bounded Double where maxBound = maxFloat (0 :: Double) minBound = -maxBound minPositiveFloat :: RealFloat a => a -> a minPositiveFloat a = encodeFloat 1 $ fst (floatRange a) - floatDigits a minPositiveDouble = minPositiveFloat (0 :: Double)