instance Integral i => Fractional (DecimalRaw i) where
(Decimal _ 0) / (Decimal _ ym) | ym /= 0 = Decimal 0 0
(Decimal p0 m0) / (Decimal 0 d) = divRem (Decimal p0 0) m0 where
divRem z 0 = z
-- out of decimalPlaces
divRem (Decimal p m) r | p == maxBound = Decimal p (m + dm) where
-- round for last digit
dm | r'*2 >= d = dm0+1
| otherwise = dm0
(dm0, r') = r `divMod` d
divRem (Decimal p m) r | r < d = divRem (Decimal (p+1) (m*10)) (r*10)
divRem (Decimal p m) r = divRem (Decimal p (m+dm)) r' where
(dm, r') = r `divMod` d
-- divide decimalPlaces
(Decimal xp xm) / (Decimal yp ym) | yp <= xp = Decimal (xp-yp) xm / Decimal 0 ym
| otherwise = Decimal 0 (xm * (10^(yp-xp))) / Decimal 0 ym
fromRational r = fromIntegral (numerator r) / fromIntegral (denominator r)
class Scalable a where
scale :: Integral b => Ratio b -> a -> a
ratio :: Integral b => a -> a -> Ratio b
instance Integral a => Scalable (DecimalRaw a) where
r `scale` x = (x * n) / d where
n = fromIntegral (numerator r)
d = fromIntegral (denominator r)
(Decimal xp xm) `ratio` (Decimal yp ym) = (fromIntegral xm * (10^yp)) % (fromIntegral ym * (10^xp))
2010-01-21
By some reason Data.Decimal from Decimal-0.1.0 misses instance for Fractional
Labels:
haskell
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment