Advertisement
Guest User

Untitled

a guest
Aug 3rd, 2015
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.93 KB | None | 0 0
  1. import Data.Ratio ((%))
  2. import GHC.Real
  3.  
  4. -- 10 decimal places
  5. newtype Fixed = Fixed Integer deriving (Eq, Ord, Enum)
  6.  
  7. instance Show Fixed where
  8. show (Fixed a) = show whole ++ "." ++ trailing where
  9. (whole, part) = a `divMod` (10 ^ 10)
  10. digits = show part
  11. trailing = replicate (10 - (length digits)) '0' ++ digits
  12.  
  13. instance Num Fixed where
  14. fromInteger n = Fixed (n * 10 ^ 10)
  15. Fixed a + Fixed b = Fixed (a + b)
  16. Fixed a - Fixed b = Fixed (a - b)
  17. Fixed a * Fixed b = Fixed ((a * b) `div` 10 ^ 10)
  18. abs (Fixed a) = Fixed (abs a)
  19. signum (Fixed a) = fromInteger (signum a)
  20.  
  21. instance Real Fixed where
  22. toRational (Fixed a) = a % (10 ^ 10)
  23.  
  24. instance Integral Fixed where
  25. toInteger (Fixed a) = a `div` 10 ^ 10
  26. Fixed a `quotRem` Fixed b = (fromInteger q, Fixed r) where
  27. (q, r) = a `quotRem` b
  28.  
  29. instance Fractional Fixed where
  30. fromRational (e :% d) = fromInteger e / fromInteger d
  31. Fixed a / Fixed b = Fixed (a * 10 ^ 10 `div` b)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement