module Algebra.RealRing98 where
{-# INLINE fastSplitFraction #-}
fastSplitFraction :: (RealFrac a, Integral b) =>
(a -> Int) -> (Int -> a) -> a -> (b,a)
fastSplitFraction trunc toFloat x =
fixSplitFraction $
if toFloat minBound <= x && x <= toFloat maxBound
then case trunc x of n -> (fromIntegral n, x - toFloat n)
else case properFraction x of (n,f) -> (fromInteger n, f)
{-# INLINE fixSplitFraction #-}
fixSplitFraction :: (Num a, Num b, Ord a) => (b,a) -> (b,a)
fixSplitFraction (n,f) =
if f>=0
then (n, f)
else (n-1, f+1)
{-# INLINE fastFraction #-}
fastFraction :: (RealFrac a) => (a -> a) -> a -> a
fastFraction trunc x =
fixFraction $
if fromIntegral (minBound :: Int) <= x && x <= fromIntegral (maxBound :: Int)
then x - trunc x
else signedFraction x
{-# INLINE signedFraction #-}
signedFraction :: (RealFrac a) => a -> a
signedFraction x =
let second :: (Integer, a) -> a
second = snd
in second (properFraction x)
{-# INLINE fixFraction #-}
fixFraction :: (Real a) => a -> a
fixFraction y =
if y>=0 then y else y+1