floating: Add instances for CDouble and CFloat.
[altfloat.git] / Data / Floating / CMath / Instances.hs
blob92084b307ffd79d4c34d9133764a7d9025e6d59d
1 {-
2 - Copyright (C) 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 -- | Class instances for 'CFloat' and 'CDouble'. As it is elsewhere in the
10 -- library, it is assumed that 'CFloat' is identical to 'Float' and 'CDouble'
11 -- is identical to 'Double'.
12 module Data.Floating.CMath.Instances where
14 import Prelude (($), (.), const, undefined)
15 import Data.Floating.Classes
16 import Data.Floating.Types
17 import Data.Floating.Types.Double
18 import Data.Floating.Types.Float
19 import Foreign.C
21 import Data.Poset
23 doubleLibm :: (Double -> Double) -> CDouble -> CDouble
24 doubleLibm f a = toFloating $ f (toFloating a)
26 floatLibm :: (Float -> Float) -> CFloat -> CFloat
27 floatLibm f a = toFloating $ f (toFloating a)
29 doubleLibm2 :: (Double -> Double -> Double) -> CDouble -> CDouble -> CDouble
30 doubleLibm2 f a b = toFloating $ f (toFloating a) (toFloating b)
32 floatLibm2 :: (Float -> Float -> Float) -> CFloat -> CFloat -> CFloat
33 floatLibm2 f a b = toFloating $ f (toFloating a) (toFloating b)
35 doubleLibm3 :: (Double -> Double -> Double -> Double)
36 -> CDouble -> CDouble -> CDouble -> CDouble
37 doubleLibm3 f a b c = toFloating
38 $ f (toFloating a) (toFloating b) (toFloating c)
40 floatLibm3 :: (Float -> Float -> Float -> Float)
41 -> CFloat -> CFloat -> CFloat -> CFloat
42 floatLibm3 f a b c = toFloating
43 $ f (toFloating a) (toFloating b) (toFloating c)
45 instance Floating CDouble where
46 (**) = doubleLibm2 (**)
47 sqrt = doubleLibm sqrt
48 acos = doubleLibm acos
49 asin = doubleLibm asin
50 atan = doubleLibm atan
51 cos = doubleLibm cos
52 sin = doubleLibm sin
53 tan = doubleLibm tan
54 acosh = doubleLibm acosh
55 asinh = doubleLibm asinh
56 atanh = doubleLibm atanh
57 cosh = doubleLibm cosh
58 sinh = doubleLibm sinh
59 tanh = doubleLibm tanh
60 exp = doubleLibm exp
61 log = doubleLibm log
63 instance Floating CFloat where
64 (**) = floatLibm2 (**)
65 sqrt = floatLibm sqrt
66 acos = floatLibm acos
67 asin = floatLibm asin
68 atan = floatLibm atan
69 cos = floatLibm cos
70 sin = floatLibm sin
71 tan = floatLibm tan
72 acosh = floatLibm acosh
73 asinh = floatLibm asinh
74 atanh = floatLibm atanh
75 cosh = floatLibm cosh
76 sinh = floatLibm sinh
77 tanh = floatLibm tanh
78 exp = floatLibm exp
79 log = floatLibm log
81 instance RealFloat CDouble where
82 fma = doubleLibm3 fma
83 copysign = doubleLibm2 copysign
84 nextafter = doubleLibm2 nextafter
85 atan2 = doubleLibm2 atan2
86 fmod = doubleLibm2 fmod
87 frem = doubleLibm2 frem
88 hypot = doubleLibm2 hypot
89 cbrt = doubleLibm cbrt
90 exp2 = doubleLibm exp2
91 expm1 = doubleLibm expm1
92 log10 = doubleLibm log10
93 log1p = doubleLibm log1p
94 log2 = doubleLibm log2
95 erf = doubleLibm erf
96 erfc = doubleLibm erfc
97 gamma = doubleLibm gamma
98 lgamma = doubleLibm lgamma
99 rint = doubleLibm rint
100 nearbyint = doubleLibm nearbyint
102 instance RealFloat CFloat where
103 fma = floatLibm3 fma
104 copysign = floatLibm2 copysign
105 nextafter = floatLibm2 nextafter
106 atan2 = floatLibm2 atan2
107 fmod = floatLibm2 fmod
108 frem = floatLibm2 frem
109 hypot = floatLibm2 hypot
110 cbrt = floatLibm cbrt
111 exp2 = floatLibm exp2
112 expm1 = floatLibm expm1
113 log10 = floatLibm log10
114 log1p = floatLibm log1p
115 log2 = floatLibm log2
116 erf = floatLibm erf
117 erfc = floatLibm erfc
118 gamma = floatLibm gamma
119 lgamma = floatLibm lgamma
120 rint = floatLibm rint
121 nearbyint = floatLibm nearbyint
123 instance Poset CDouble where
124 compare x y = compare (toFloating x :: Double) (toFloating y :: Double)
125 x <==> y = (toFloating x :: Double) <==> (toFloating y :: Double)
126 x </=> y = (toFloating x :: Double) </=> (toFloating y :: Double)
127 x < y = (toFloating x :: Double) < (toFloating y :: Double)
128 x <= y = (toFloating x :: Double) <= (toFloating y :: Double)
129 x >= y = (toFloating x :: Double) >= (toFloating y :: Double)
130 x > y = (toFloating x :: Double) > (toFloating y :: Double)
132 instance Poset CFloat where
133 compare x y = compare (toFloating x :: Float) (toFloating y :: Float)
134 x <==> y = (toFloating x :: Float) <==> (toFloating y :: Float)
135 x </=> y = (toFloating x :: Float) </=> (toFloating y :: Float)
136 x < y = (toFloating x :: Float) < (toFloating y :: Float)
137 x <= y = (toFloating x :: Float) <= (toFloating y :: Float)
138 x >= y = (toFloating x :: Float) >= (toFloating y :: Float)
139 x > y = (toFloating x :: Float) > (toFloating y :: Float)
141 instance Sortable CDouble where
142 isOrdered x = isOrdered (toFloating x :: Double)
143 max = doubleLibm2 max
144 min = doubleLibm2 min
146 instance Sortable CFloat where
147 isOrdered x = isOrdered (toFloating x :: Float)
148 max = floatLibm2 max
149 min = floatLibm2 min
151 instance Roundable CDouble where
152 toIntegral x = toIntegral (toFloating x :: Double)
153 ceiling = doubleLibm ceiling
154 floor = doubleLibm floor
155 truncate = doubleLibm truncate
156 round = doubleLibm round
158 instance Roundable CFloat where
159 toIntegral x = toIntegral (toFloating x :: Float)
160 ceiling = floatLibm ceiling
161 floor = floatLibm floor
162 truncate = floatLibm truncate
163 round = floatLibm round
165 instance PrimFloat CDouble where
166 floatRadix = const $ floatRadix (undefined :: Double)
167 floatPrecision = const $ floatPrecision (undefined :: Double)
168 floatRange = const $ floatRange (undefined :: Double)
169 classify t = classify (toFloating t :: Double)
170 logb = doubleLibm logb
171 scalb x = toFloating . scalb (toFloating x :: Double)
173 instance PrimFloat CFloat where
174 floatRadix = const $ floatRadix (undefined :: Float)
175 floatPrecision = const $ floatPrecision (undefined :: Float)
176 floatRange = const $ floatRange (undefined :: Float)
177 classify t = classify (toFloating t :: Float)
178 logb = floatLibm logb
179 scalb x = toFloating . scalb (toFloating x :: Float)