roundable: Split out the Roundable class.
[altfloat.git] / Data / Floating.hs
blob29e7ec96495732f2e9c9389242f6ef41e8c9c03c
1 {-
2 - Copyright (C) 2009-2010 Nick Bowler.
4 - License BSD2: 2-clause BSD license. See LICENSE for full terms.
5 - This is free software: you are free to change and redistribute it.
6 - There is NO WARRANTY, to the extent permitted by law.
7 -}
9 -- | Top level module for alternative floating point support.
10 module Data.Floating (
11 Double, Float,
12 module Data.Floating.Types.Core,
13 module Data.Floating,
14 ) where
16 import Prelude hiding (RealFloat(..), RealFrac(..), Double, Float)
17 import Data.Floating.Types.Core hiding (Double, Float, FloatConvert)
18 import Data.Floating.Types.Double
19 import Data.Floating.Types.Float
20 import Data.Floating.Environment
21 import Data.Floating.Types.CMath
23 import Control.Monad
25 isInfinite :: PrimFloat a => a -> Bool
26 isInfinite = (== FPInfinite) . classify
28 isNaN :: PrimFloat a => a -> Bool
29 isNaN = (== FPNaN) . classify
31 isNormal :: PrimFloat a => a -> Bool
32 isNormal = (== FPNormal) . classify
34 isSubNormal :: PrimFloat a => a -> Bool
35 isSubNormal = (== FPSubNormal) . classify
37 isFinite :: PrimFloat a => a -> Bool
38 isFinite = not . liftM2 (||) isInfinite isNaN
40 isNegativeZero :: PrimFloat a => a -> Bool
41 isNegativeZero = liftM2 (&&) ((== FPZero) . classify) ((== (-1)) . signum)
43 -- | @fquotRem x y@ computes the remainder and integral quotient upon division
44 -- of x by y. The result is (x-n*y, n), where n is the value x/y rounded to
45 -- the nearest integer.
46 fquotRem :: RealFloat a => a -> a -> (a, a)
47 fquotRem x y = (frem x y, nearbyint (x/y))