{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE UndecidableInstances #-}
module Grisette.Internal.Core.Data.Class.IEEEFP
( fpIsNaN,
fpIsPositiveZero,
fpIsNegativeZero,
fpIsPositiveInfinite,
fpIsNegativeInfinite,
fpIsPositive,
fpIsNegative,
fpIsInfinite,
fpIsZero,
fpIsNormal,
fpIsSubnormal,
fpIsPoint,
IEEEFPConstants (..),
IEEEFPRoundingMode (..),
IEEEFPOp (..),
IEEEFPRoundingOp (..),
IEEEFPConvertible (..),
IEEEFPToAlgReal (..),
)
where
fpIsNaN :: (RealFloat a) => a -> Bool
fpIsNaN :: forall a. RealFloat a => a -> Bool
fpIsNaN = a -> Bool
forall a. RealFloat a => a -> Bool
isNaN
{-# INLINE fpIsNaN #-}
fpIsPositiveZero :: (RealFloat a) => a -> Bool
fpIsPositiveZero :: forall a. RealFloat a => a -> Bool
fpIsPositiveZero a
x = a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0 Bool -> Bool -> Bool
&& Bool -> Bool
not (a -> Bool
forall a. RealFloat a => a -> Bool
fpIsNegativeZero a
x)
{-# INLINE fpIsPositiveZero #-}
fpIsNegativeZero :: (RealFloat a) => a -> Bool
fpIsNegativeZero :: forall a. RealFloat a => a -> Bool
fpIsNegativeZero = a -> Bool
forall a. RealFloat a => a -> Bool
isNegativeZero
{-# INLINE fpIsNegativeZero #-}
fpIsPositiveInfinite :: (RealFloat a) => a -> Bool
fpIsPositiveInfinite :: forall a. RealFloat a => a -> Bool
fpIsPositiveInfinite a
x = a -> Bool
forall a. RealFloat a => a -> Bool
isInfinite a
x Bool -> Bool -> Bool
&& a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0
{-# INLINE fpIsPositiveInfinite #-}
fpIsNegativeInfinite :: (RealFloat a) => a -> Bool
fpIsNegativeInfinite :: forall a. RealFloat a => a -> Bool
fpIsNegativeInfinite a
x = a -> Bool
forall a. RealFloat a => a -> Bool
isInfinite a
x Bool -> Bool -> Bool
&& a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
0
{-# INLINE fpIsNegativeInfinite #-}
fpIsPositive :: (RealFloat a) => a -> Bool
fpIsPositive :: forall a. RealFloat a => a -> Bool
fpIsPositive a
x = Bool -> Bool
not (a -> Bool
forall a. RealFloat a => a -> Bool
fpIsNaN a
x) Bool -> Bool -> Bool
&& (a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0 Bool -> Bool -> Bool
|| a -> Bool
forall a. RealFloat a => a -> Bool
fpIsPositiveZero a
x)
{-# INLINE fpIsPositive #-}
fpIsNegative :: (RealFloat a) => a -> Bool
fpIsNegative :: forall a. RealFloat a => a -> Bool
fpIsNegative a
x = Bool -> Bool
not (a -> Bool
forall a. RealFloat a => a -> Bool
fpIsNaN a
x) Bool -> Bool -> Bool
&& (a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
0 Bool -> Bool -> Bool
|| a -> Bool
forall a. RealFloat a => a -> Bool
isNegativeZero a
x)
{-# INLINE fpIsNegative #-}
fpIsInfinite :: (RealFloat a) => a -> Bool
fpIsInfinite :: forall a. RealFloat a => a -> Bool
fpIsInfinite a
x = a -> Bool
forall a. RealFloat a => a -> Bool
fpIsPositiveInfinite a
x Bool -> Bool -> Bool
|| a -> Bool
forall a. RealFloat a => a -> Bool
fpIsNegativeInfinite a
x
{-# INLINE fpIsInfinite #-}
fpIsZero :: (RealFloat a) => a -> Bool
fpIsZero :: forall a. RealFloat a => a -> Bool
fpIsZero a
x = a -> Bool
forall a. RealFloat a => a -> Bool
fpIsPositiveZero a
x Bool -> Bool -> Bool
|| a -> Bool
forall a. RealFloat a => a -> Bool
fpIsNegativeZero a
x
{-# INLINE fpIsZero #-}
fpIsNormal :: (RealFloat a) => a -> Bool
fpIsNormal :: forall a. RealFloat a => a -> Bool
fpIsNormal a
x =
Bool -> Bool
not (a -> Bool
forall a. RealFloat a => a -> Bool
fpIsZero a
x)
Bool -> Bool -> Bool
&& Bool -> Bool
not (a -> Bool
forall a. RealFloat a => a -> Bool
fpIsSubnormal a
x)
Bool -> Bool -> Bool
&& Bool -> Bool
not (a -> Bool
forall a. RealFloat a => a -> Bool
fpIsInfinite a
x)
Bool -> Bool -> Bool
&& Bool -> Bool
not (a -> Bool
forall a. RealFloat a => a -> Bool
fpIsNaN a
x)
{-# INLINE fpIsNormal #-}
fpIsSubnormal :: (RealFloat a) => a -> Bool
fpIsSubnormal :: forall a. RealFloat a => a -> Bool
fpIsSubnormal = a -> Bool
forall a. RealFloat a => a -> Bool
isDenormalized
{-# INLINE fpIsSubnormal #-}
fpIsPoint :: (RealFloat a) => a -> Bool
fpIsPoint :: forall a. RealFloat a => a -> Bool
fpIsPoint a
x = Bool -> Bool
not (a -> Bool
forall a. RealFloat a => a -> Bool
fpIsInfinite a
x) Bool -> Bool -> Bool
&& Bool -> Bool
not (a -> Bool
forall a. RealFloat a => a -> Bool
fpIsNaN a
x)
{-# INLINE fpIsPoint #-}
class IEEEFPConstants a where
fpPositiveInfinite :: a
fpNegativeInfinite :: a
fpNaN :: a
fpNegativeZero :: a
fpPositiveZero :: a
fpMinNormalized :: a
fpMinSubnormal :: a
fpMaxNormalized :: a
fpMaxSubnormal :: a
class IEEEFPOp a where
fpAbs :: a -> a
fpNeg :: a -> a
fpRem :: a -> a -> a
fpMinimum :: a -> a -> a
fpMinimumNumber :: a -> a -> a
fpMaximum :: a -> a -> a
fpMaximumNumber :: a -> a -> a
class IEEEFPRoundingMode mode where
rne :: mode
rna :: mode
rtp :: mode
rtn :: mode
rtz :: mode
class (IEEEFPRoundingMode mode) => IEEEFPRoundingOp a mode | a -> mode where
fpAdd :: mode -> a -> a -> a
fpSub :: mode -> a -> a -> a
fpMul :: mode -> a -> a -> a
fpDiv :: mode -> a -> a -> a
fpFMA :: mode -> a -> a -> a -> a
fpSqrt :: mode -> a -> a
fpRoundToIntegral :: mode -> a -> a
class IEEEFPConvertible a fp mode | fp -> mode where
fromFPOr ::
a ->
mode ->
fp ->
a
toFP :: mode -> a -> fp
class
(IEEEFPConvertible a fp mode, IEEEFPRoundingMode mode) =>
IEEEFPToAlgReal a fp mode
| fp -> mode
where
fpToAlgReal :: a -> fp -> a
fpToAlgReal a
d = a -> mode -> fp -> a
forall a fp mode.
IEEEFPConvertible a fp mode =>
a -> mode -> fp -> a
fromFPOr a
d mode
forall mode. IEEEFPRoundingMode mode => mode
rna