{-# LANGUAGE CPP
, MultiParamTypeClasses
, FlexibleInstances
#-}
#if __GLASGOW_HASKELL__ < 710
{-# LANGUAGE OverlappingInstances #-}
#endif
{-# OPTIONS_GHC -XMagicHash #-}
{-# OPTIONS_GHC -Wall -fwarn-tabs #-}
module Data.Number.RealToFrac (RealToFrac(..)) where
import Prelude hiding (realToFrac, isInfinite, isNaN)
import qualified Prelude (realToFrac)
import Data.Number.Transfinite
#ifdef __GLASGOW_HASKELL__
import GHC.Exts
( Int(..), Float(..), Double(..)
, int2Double#
, int2Float#
, double2Float#
, float2Double#
)
#endif
class (Real a, Fractional b) => RealToFrac a b where
realToFrac :: a -> b
instance (Real a, Fractional a) => RealToFrac a a where
realToFrac :: a -> a
realToFrac = a -> a
forall a. a -> a
id
instance
#if __GLASGOW_HASKELL__ >= 710
{-# OVERLAPPABLE #-}
#endif
(Real a, Transfinite a, Fractional b, Transfinite b)
=> RealToFrac a b
where
realToFrac :: a -> b
realToFrac a
x
| a -> Bool
forall a. Transfinite a => a -> Bool
isNaN a
x = b
forall a. Transfinite a => a
notANumber
| a -> Bool
forall a. Transfinite a => a -> Bool
isInfinite a
x = if a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0 then b
forall a. Transfinite a => a
infinity
else b
forall a. Transfinite a => a
negativeInfinity
| Bool
otherwise = a -> b
forall a b. (Real a, Fractional b) => a -> b
Prelude.realToFrac a
x
#ifdef __GLASGOW_HASKELL__
instance
#if __GLASGOW_HASKELL__ >= 710
{-# OVERLAPPING #-}
#endif
RealToFrac Int Float where
{-# INLINE realToFrac #-}
realToFrac :: Int -> Float
realToFrac (I# Int#
i) = Float# -> Float
F# (Int# -> Float#
int2Float# Int#
i)
instance
#if __GLASGOW_HASKELL__ >= 710
{-# OVERLAPPING #-}
#endif
RealToFrac Int Double where
{-# INLINE realToFrac #-}
realToFrac :: Int -> Double
realToFrac (I# Int#
i) = Double# -> Double
D# (Int# -> Double#
int2Double# Int#
i)
instance
#if __GLASGOW_HASKELL__ >= 710
{-# OVERLAPPING #-}
#endif
RealToFrac Integer Float where
{-# INLINE realToFrac #-}
realToFrac :: Integer -> Float
realToFrac Integer
j = Integer -> Float
forall a b. (Real a, Fractional b) => a -> b
Prelude.realToFrac Integer
j
instance
#if __GLASGOW_HASKELL__ >= 710
{-# OVERLAPPING #-}
#endif
RealToFrac Integer Double where
{-# INLINE realToFrac #-}
realToFrac :: Integer -> Double
realToFrac Integer
j = Integer -> Double
forall a b. (Real a, Fractional b) => a -> b
Prelude.realToFrac Integer
j
instance
#if __GLASGOW_HASKELL__ >= 710
{-# OVERLAPPING #-}
#endif
RealToFrac Float Double where
{-# INLINE realToFrac #-}
realToFrac :: Float -> Double
realToFrac (F# Float#
f) = Double# -> Double
D# (Float# -> Double#
float2Double# Float#
f)
instance
#if __GLASGOW_HASKELL__ >= 710
{-# OVERLAPPING #-}
#endif
RealToFrac Double Float where
{-# INLINE realToFrac #-}
realToFrac :: Double -> Float
realToFrac (D# Double#
d) = Float# -> Float
F# (Double# -> Float#
double2Float# Double#
d)
#endif