module Algebra.RealRing98 where
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)
fixSplitFraction :: (Num a, Num b, Ord a) => (b,a) -> (b,a)
fixSplitFraction (n,f) =
if f>=0
then (n, f)
else (n1, f+1)
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
signedFraction :: (RealFrac a) => a -> a
signedFraction x =
let second :: (Integer, a) -> a
second = snd
in second (properFraction x)
fixFraction :: (Real a) => a -> a
fixFraction y =
if y>=0 then y else y+1