(original) (raw)
{-# LANGUAGE Trustworthy #-} {-# LANGUAGE CPP, MagicHash, UnboxedTuples, NoImplicitPrelude #-} {-# OPTIONS_HADDOCK not-home #-}
#include "MachDeps.h"
module GHC.Float.RealFracMethods (
[properFractionDoubleInteger](GHC.Float.RealFracMethods.html#properFractionDoubleInteger)
, [truncateDoubleInteger](GHC.Float.RealFracMethods.html#truncateDoubleInteger)
, [floorDoubleInteger](GHC.Float.RealFracMethods.html#floorDoubleInteger)
, [ceilingDoubleInteger](GHC.Float.RealFracMethods.html#ceilingDoubleInteger)
, [roundDoubleInteger](GHC.Float.RealFracMethods.html#roundDoubleInteger)
, [properFractionDoubleInt](GHC.Float.RealFracMethods.html#properFractionDoubleInt)
, [floorDoubleInt](GHC.Float.RealFracMethods.html#floorDoubleInt)
, [ceilingDoubleInt](GHC.Float.RealFracMethods.html#ceilingDoubleInt)
, [roundDoubleInt](GHC.Float.RealFracMethods.html#roundDoubleInt)
, [double2Int](GHC.Float.RealFracMethods.html#double2Int)
, [int2Double](GHC.Float.RealFracMethods.html#int2Double)
, [properFractionFloatInteger](GHC.Float.RealFracMethods.html#properFractionFloatInteger)
, [truncateFloatInteger](GHC.Float.RealFracMethods.html#truncateFloatInteger)
, [floorFloatInteger](GHC.Float.RealFracMethods.html#floorFloatInteger)
, [ceilingFloatInteger](GHC.Float.RealFracMethods.html#ceilingFloatInteger)
, [roundFloatInteger](GHC.Float.RealFracMethods.html#roundFloatInteger)
, [properFractionFloatInt](GHC.Float.RealFracMethods.html#properFractionFloatInt)
, [floorFloatInt](GHC.Float.RealFracMethods.html#floorFloatInt)
, [ceilingFloatInt](GHC.Float.RealFracMethods.html#ceilingFloatInt)
, [roundFloatInt](GHC.Float.RealFracMethods.html#roundFloatInt)
, [float2Int](GHC.Float.RealFracMethods.html#float2Int)
, [int2Float](GHC.Float.RealFracMethods.html#int2Float)
) whereimport GHC.Num.Integer
import GHC.Base import GHC.Num ()
#if WORD_SIZE_IN_BITS < 64
#define TO64 integerToInt64# #define FROM64 integerFromInt64# #define MINUS64 subInt64# #define NEGATE64 negateInt64#
#else
#define TO64 integerToInt# #define FROM64 IS #define MINUS64 ( -# ) #define NEGATE64 negateInt#
uncheckedIShiftRA64# :: Int# -> Int# -> Int# uncheckedIShiftRA64# :: Int# -> Int# -> Int# uncheckedIShiftRA64# = Int# -> Int# -> Int# uncheckedIShiftRA#
uncheckedIShiftL64# :: Int# -> Int# -> Int# uncheckedIShiftL64# :: Int# -> Int# -> Int# uncheckedIShiftL64# = Int# -> Int# -> Int# uncheckedIShiftL#
#endif
default ()
properFractionFloatInt :: Float -> (Int, Float)
properFractionFloatInt :: Float -> (Int, Float)
properFractionFloatInt (F# Float#
x) =
if Int# -> Bool
isTrue# (Float#
x Float# -> Float# -> Int#
eqFloat# Float#
0.0#)
then (Int# -> Int
I# Int#
0#, Float# -> Float
F# Float#
0.0#)
else case Float# -> Int#
float2Int# Float#
x of
Int#
n -> (Int# -> Int
I# Int#
n, Float# -> Float
F# (Float#
x Float# -> Float# -> Float#
minusFloat# Int# -> Float#
int2Float# Int#
n))
floorFloatInt :: Float -> Int
floorFloatInt :: Float -> Int
floorFloatInt (F# Float#
x) =
case Float# -> Int#
float2Int# Float#
x of
Int#
n | Int# -> Bool
isTrue# (Float#
x Float# -> Float# -> Int#
ltFloat# Int# -> Float#
int2Float# Int#
n) -> Int# -> Int
I# (Int#
n Int# -> Int# -> Int#
-# Int#
1#)
| Bool
otherwise -> Int# -> Int
I# Int#
n
ceilingFloatInt :: Float -> Int
ceilingFloatInt :: Float -> Int
ceilingFloatInt (F# Float#
x) =
case Float# -> Int#
float2Int# Float#
x of
Int#
n | Int# -> Bool
isTrue# (Int# -> Float#
int2Float# Int#
n Float# -> Float# -> Int#
ltFloat# Float#
x) -> Int# -> Int
I# (Int#
n Int# -> Int# -> Int#
+# Int#
1#)
| Bool
otherwise -> Int# -> Int
I# Int#
n
roundFloatInt :: Float -> Int roundFloatInt :: Float -> Int roundFloatInt Float x = Float -> Int float2Int (Float -> Float c_rintFloat Float x)
{-# INLINE properFractionFloatInteger #-}
properFractionFloatInteger :: Float -> (Integer, Float)
properFractionFloatInteger :: Float -> (Integer, Float)
properFractionFloatInteger v :: Float
v@(F# Float#
x) =
case Float# -> (# Int#, Int# #)
decodeFloat_Int# Float#
x of
(# Int#
m, Int#
e #)
| Int# -> Bool
isTrue# (Int#
e Int# -> Int# -> Int#
<# Int#
0#) ->
case Int# -> Int#
negateInt# Int#
e of
Int#
s | Int# -> Bool
isTrue# (Int#
s Int# -> Int# -> Int#
># Int#
23#) -> (Integer
0, Float
v)
| Int# -> Bool
isTrue# (Int#
m Int# -> Int# -> Int#
<# Int#
0#) ->
case Int# -> Int#
negateInt# (Int# -> Int#
negateInt# Int#
m Int# -> Int# -> Int#
uncheckedIShiftRA# Int#
s) of
Int#
k -> (Int# -> Integer
IS Int#
k,
case Int#
m Int# -> Int# -> Int#
-# (Int#
k Int# -> Int# -> Int#
uncheckedIShiftL# Int#
s) of
Int#
r -> Float# -> Float
F# (Integer -> Int# -> Float#
integerEncodeFloat# (Int# -> Integer
IS Int#
r) Int#
e))
| Bool
otherwise ->
case Int#
m Int# -> Int# -> Int#
uncheckedIShiftRL# Int#
s of
Int#
k -> (Int# -> Integer
IS Int#
k,
case Int#
m Int# -> Int# -> Int#
-# (Int#
k Int# -> Int# -> Int#
uncheckedIShiftL# Int#
s) of
Int#
r -> Float# -> Float
F# (Integer -> Int# -> Float#
integerEncodeFloat# (Int# -> Integer
IS Int#
r) Int#
e))
| Bool
otherwise -> (Integer -> Word# -> Integer
integerShiftL# (Int# -> Integer
IS Int#
m) (Int# -> Word#
int2Word# Int#
e), Float# -> Float
F# Float#
0.0#)
{-# INLINE truncateFloatInteger #-} truncateFloatInteger :: Float -> Integer truncateFloatInteger :: Float -> Integer truncateFloatInteger Float x = case Float -> (Integer, Float) properFractionFloatInteger Float x of (Integer n, Float _) -> Integer n
{-# INLINE floorFloatInteger #-} floorFloatInteger :: Float -> Integer floorFloatInteger :: Float -> Integer floorFloatInteger (F# Float# x) = case Float# -> (# Int#, Int# #) decodeFloat_Int# Float# x of (# Int# m, Int# e #) | Int# -> Bool isTrue# (Int# e Int# -> Int# -> Int# <# Int# 0#) -> case Int# -> Int# negateInt# Int# e of Int# s | Int# -> Bool isTrue# (Int# s Int# -> Int# -> Int# ># Int# 23#) -> if Int# -> Bool isTrue# (Int# m Int# -> Int# -> Int# <# Int# 0#) then (-Integer
- else Integer 0 | Bool
otherwise -> Int# -> Integer
IS (Int#
m Int# -> Int# -> Int#
uncheckedIShiftRA# Int#
s)
| Bool
otherwise -> Integer -> Word# -> Integer
integerShiftL# (Int# -> Integer
IS Int#
m) (Int# -> Word#
int2Word# Int#
e)
{-# INLINE ceilingFloatInteger #-} ceilingFloatInteger :: Float -> Integer ceilingFloatInteger :: Float -> Integer ceilingFloatInteger (F# Float# x) = Integer -> Integer integerNegate (Float -> Integer floorFloatInteger (Float# -> Float F# (Float# -> Float# negateFloat# Float# x)))
{-# INLINE roundFloatInteger #-} roundFloatInteger :: Float -> Integer roundFloatInteger :: Float -> Integer roundFloatInteger Float x = Float -> Integer float2Integer (Float -> Float c_rintFloat Float x)
properFractionDoubleInt :: Double -> (Int, Double) properFractionDoubleInt :: Double -> (Int, Double) properFractionDoubleInt (D# Double# x) = if Int# -> Bool isTrue# (Double# x Double# -> Double# -> Int# ==## Double# 0.0##) then (Int# -> Int I# Int# 0#, Double# -> Double D# Double# 0.0##) else case Double# -> Int# double2Int# Double# x of Int# n -> (Int# -> Int I# Int# n, Double# -> Double D# (Double# x Double# -> Double# -> Double# -## Int# -> Double# int2Double# Int# n))
floorDoubleInt :: Double -> Int floorDoubleInt :: Double -> Int floorDoubleInt (D# Double# x) = case Double# -> Int# double2Int# Double# x of Int# n | Int# -> Bool isTrue# (Double# x Double# -> Double# -> Int# <## Int# -> Double# int2Double# Int# n) -> Int# -> Int I# (Int# n Int# -> Int# -> Int# -# Int# 1#) | Bool otherwise -> Int# -> Int I# Int# n
ceilingDoubleInt :: Double -> Int ceilingDoubleInt :: Double -> Int ceilingDoubleInt (D# Double# x) = case Double# -> Int# double2Int# Double# x of Int# n | Int# -> Bool isTrue# (Int# -> Double# int2Double# Int# n Double# -> Double# -> Int# <## Double# x) -> Int# -> Int I# (Int# n Int# -> Int# -> Int# +# Int# 1#) | Bool otherwise -> Int# -> Int I# Int# n
roundDoubleInt :: Double -> Int roundDoubleInt :: Double -> Int roundDoubleInt Double x = Double -> Int double2Int (Double -> Double c_rintDouble Double x)
{-# INLINE properFractionDoubleInteger #-}
properFractionDoubleInteger :: Double -> (Integer, Double)
properFractionDoubleInteger :: Double -> (Integer, Double)
properFractionDoubleInteger v :: Double
v@(D# Double#
x) =
case Double# -> (# Integer, Int# #)
integerDecodeDouble# Double#
x of
(# Integer
m, Int#
e #)
| Int# -> Bool
isTrue# (Int#
e Int# -> Int# -> Int#
<# Int#
0#) ->
case Int# -> Int#
negateInt# Int#
e of
Int#
s | Int# -> Bool
isTrue# (Int#
s Int# -> Int# -> Int#
># Int#
52#) -> (Integer
0, Double
v)
| Integer
m Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
< Integer
0 ->
case TO64 (integerNegate m) of
Int#
n ->
case Int#
n Int# -> Int# -> Int#
uncheckedIShiftRA64# Int#
s of
Int#
k ->
(FROM64 (NEGATE64 k),
case MINUS64 n Int#
(k uncheckedIShiftL64# s) of
Int#
r ->
Double# -> Double
D# (Integer -> Int# -> Double#
integerEncodeDouble# (FROM64 (NEGATE64 r)Int#
) e))
| Bool
otherwise ->
case TO64 m of
Int#
n ->
case Int#
n Int# -> Int# -> Int#
uncheckedIShiftRA64# Int#
s of
Int#
k -> (FROM64 k,
case MINUS64 n Int#
(k uncheckedIShiftL64# s) of
Int#
r -> Double# -> Double
D# (Integer -> Int# -> Double#
integerEncodeDouble# (FROM64 r) e))
| Bool
otherwise -> (Integer -> Word# -> Integer
integerShiftL# Integer
m (Int# -> Word#
int2Word# Int#
e), Double# -> Double
D# Double#
0.0##)
{-# INLINE truncateDoubleInteger #-} truncateDoubleInteger :: Double -> Integer truncateDoubleInteger :: Double -> Integer truncateDoubleInteger Double x = case Double -> (Integer, Double) properFractionDoubleInteger Double x of (Integer n, Double _) -> Integer n
{-# INLINE floorDoubleInteger #-} floorDoubleInteger :: Double -> Integer floorDoubleInteger :: Double -> Integer floorDoubleInteger (D# Double# x) = case Double# -> (# Integer, Int# #) integerDecodeDouble# Double# x of (# Integer m, Int# e #) | Int# -> Bool isTrue# (Int# e Int# -> Int# -> Int# <# Int# 0#) -> case Int# -> Int# negateInt# Int# e of Int# s | Int# -> Bool isTrue# (Int# s Int# -> Int# -> Int# ># Int# 52#) -> if Integer m Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool < Integer 0 then (-Integer
- else Integer 0 | Bool
otherwise ->
case TO64 m of
Int#
n -> FROM64 (n uncheckedIShiftRA64# s)
| Bool
otherwise -> Integer -> Word# -> Integer
integerShiftL# Integer
m (Int# -> Word#
int2Word# Int#
e)
{-# INLINE ceilingDoubleInteger #-} ceilingDoubleInteger :: Double -> Integer ceilingDoubleInteger :: Double -> Integer ceilingDoubleInteger (D# Double# x) = Integer -> Integer integerNegate (Double -> Integer floorDoubleInteger (Double# -> Double D# (Double# -> Double# negateDouble# Double# x)))
{-# INLINE roundDoubleInteger #-} roundDoubleInteger :: Double -> Integer roundDoubleInteger :: Double -> Integer roundDoubleInteger Double x = Double -> Integer double2Integer (Double -> Double c_rintDouble Double x)
double2Int :: Double -> Int double2Int :: Double -> Int double2Int (D# Double# x) = Int# -> Int I# (Double# -> Int# double2Int# Double# x)
int2Double :: Int -> Double int2Double :: Int -> Double int2Double (I# Int# i) = Double# -> Double D# (Int# -> Double# int2Double# Int# i)
float2Int :: Float -> Int float2Int :: Float -> Int float2Int (F# Float# x) = Int# -> Int I# (Float# -> Int# float2Int# Float# x)
int2Float :: Int -> Float int2Float :: Int -> Float int2Float (I# Int# i) = Float# -> Float F# (Int# -> Float# int2Float# Int# i)
{-# INLINE double2Integer #-}
double2Integer :: Double -> Integer
double2Integer :: Double -> Integer
double2Integer (D# Double#
x) =
case Double# -> (# Integer, Int# #)
integerDecodeDouble# Double#
x of
(# Integer
m, Int#
e #)
| Int# -> Bool
isTrue# (Int#
e Int# -> Int# -> Int#
<# Int#
0#) ->
case TO64 m of
Int#
n -> FROM64 (n uncheckedIShiftRA64# negateInt# e)
| Bool
otherwise -> Integer -> Word# -> Integer
integerShiftL# Integer
m (Int# -> Word#
int2Word# Int#
e)
{-# INLINE float2Integer #-}
float2Integer :: Float -> Integer
float2Integer :: Float -> Integer
float2Integer (F# Float#
x) =
case Float# -> (# Int#, Int# #)
decodeFloat_Int# Float#
x of
(# Int#
m, Int#
e #)
| Int# -> Bool
isTrue# (Int#
e Int# -> Int# -> Int#
<# Int#
0#) -> Int# -> Integer
IS (Int#
m Int# -> Int# -> Int#
uncheckedIShiftRA# Int# -> Int#
negateInt# Int#
e)
| Bool
otherwise -> Integer -> Word# -> Integer
integerShiftL# (Int# -> Integer
IS Int#
m) (Int# -> Word#
int2Word# Int#
e)
foreign import ccall unsafe "rintDouble" c_rintDouble :: Double -> Double
foreign import ccall unsafe "rintFloat" c_rintFloat :: Float -> Float