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.
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
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
54 acosh = doubleLibm
acosh
55 asinh = doubleLibm
asinh
56 atanh = doubleLibm
atanh
57 cosh = doubleLibm
cosh
58 sinh = doubleLibm
sinh
59 tanh = doubleLibm
tanh
63 instance Floating CFloat
where
64 (**) = floatLibm2
(**)
72 acosh = floatLibm
acosh
73 asinh = floatLibm
asinh
74 atanh = floatLibm
atanh
81 instance RealFloat CDouble
where
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
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
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
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)
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)