module Gamgine.Math.Utils where

clamp :: Double -> Double -> Double -> Double
clamp :: Double -> Double -> Double -> Double
clamp Double
min Double
max Double
value
   | Double
value Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Double
min = Double
min
   | Double
value Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
> Double
max = Double
max
   | Bool
otherwise = Double
value

flipSign :: Double -> Double
flipSign :: Double -> Double
flipSign Double
num = -Double
1 Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double -> Double
forall a. Num a => a -> a
signum Double
num

maxFloat :: RealFloat a => a -> a
maxFloat :: forall a. RealFloat a => a -> a
maxFloat a
a = Integer -> Int -> a
forall a. RealFloat a => Integer -> Int -> a
encodeFloat Integer
m Int
n
   where
      b :: Integer
b = a -> Integer
forall a. RealFloat a => a -> Integer
floatRadix a
a
      e :: Int
e = a -> Int
forall a. RealFloat a => a -> Int
floatDigits a
a
      (Int
_, Int
e') = a -> (Int, Int)
forall a. RealFloat a => a -> (Int, Int)
floatRange a
a
      m :: Integer
m = Integer
b Integer -> Int -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^ Int
e Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
1
      n :: Int
n = Int
e' Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
e

instance Bounded Double where
   maxBound :: Double
maxBound = Double -> Double
forall a. RealFloat a => a -> a
maxFloat (Double
0 :: Double)
   minBound :: Double
minBound = -Double
forall a. Bounded a => a
maxBound

minPositiveFloat :: RealFloat a => a -> a
minPositiveFloat :: forall a. RealFloat a => a -> a
minPositiveFloat a
a = Integer -> Int -> a
forall a. RealFloat a => Integer -> Int -> a
encodeFloat Integer
1 (Int -> a) -> Int -> a
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> Int
forall a b. (a, b) -> a
fst (a -> (Int, Int)
forall a. RealFloat a => a -> (Int, Int)
floatRange a
a) Int -> Int -> Int
forall a. Num a => a -> a -> a
- a -> Int
forall a. RealFloat a => a -> Int
floatDigits a
a

minPositiveDouble :: Double
minPositiveDouble = Double -> Double
forall a. RealFloat a => a -> a
minPositiveFloat (Double
0 :: Double)