3965e259c586994ccb10e5c0784435769dbb5d3d
[altfloat.git] / Data / Floating.hs
blob3965e259c586994ccb10e5c0784435769dbb5d3d
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 module Data.Floating.Classes,
12 Double, Float,
13 module Data.Floating,
14 toFloating
15 ) where
17 import Prelude hiding (RealFloat(..), RealFrac(..), Double, Float)
18 import Data.Floating.Classes
19 import Data.Floating.Instances
20 import Data.Floating.Types
21 import Data.Floating.Types.Double
22 import Data.Floating.Types.Float
23 import Data.Floating.Environment
25 import Control.Monad
27 isInfinite :: PrimFloat a => a -> Bool
28 isInfinite = (== FPInfinite) . classify
30 isNaN :: PrimFloat a => a -> Bool
31 isNaN = (== FPNaN) . classify
33 isNormal :: PrimFloat a => a -> Bool
34 isNormal = (== FPNormal) . classify
36 isSubNormal :: PrimFloat a => a -> Bool
37 isSubNormal = (== FPSubNormal) . classify
39 isFinite :: PrimFloat a => a -> Bool
40 isFinite = not . liftM2 (||) isInfinite isNaN
42 isNegativeZero :: PrimFloat a => a -> Bool
43 isNegativeZero = liftM2 (&&) ((== FPZero) . classify) ((== (-1)) . signum)
45 -- | @fquotRem x y@ computes the remainder and integral quotient upon division
46 -- of x by y. The result is (x-n*y, n), where n is the value x/y rounded to
47 -- the nearest integer.
48 fquotRem :: RealFloat a => a -> a -> (a, a)
49 fquotRem x y = (frem x y, nearbyint (x/y))