Real(toRational),
-- Integral(quot, rem, div, mod, quotRem, divMod, toInteger),
Integral(quot, rem, div, mod, quotRem, divMod, even, odd, toInteger, toInt),
- Fractional((/), recip, fromRational), fromDouble,
+ Fractional((/), recip, fromRational, fromDouble),
Floating(pi, exp, log, sqrt, (**), logBase, sin, cos, tan,
asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh),
RealFrac(properFraction, truncate, round, ceiling, floor),
(/) :: a -> a -> a
recip :: a -> a
fromRational :: Rational -> a
+ fromDouble :: Double -> a
-- Minimal complete definition: fromRational and ((/) or recip)
recip x = 1 / x
x / y = x * recip y
-fromDouble :: Fractional a => Double -> a
-fromDouble n = fromRational (toRational n)
-
class (Fractional a) => Floating a where
pi :: a
exp, log, sqrt :: a -> a
instance Fractional Float where
(/) = primDivideFloat
fromRational = rationalToRealFloat
+ fromDouble = primDoubleToFloat
instance Fractional Double where
(/) = primDivideDouble
fromRational = rationalToRealFloat
+ fromDouble x = x
rationalToRealFloat x = x'
where x' = f e
(x:%y) / (x':%y') = (x*y') % (y*x')
recip (x:%y) = if x < 0 then (-y) :% (-x) else y :% x
fromRational (x:%y) = fromInteger x :% fromInteger y
+ fromDouble = doubleToRatio
-- Hugs optimises code of the form fromRational (doubleToRatio x)
doubleToRatio :: Integral a => Double -> Ratio a
Real(toRational),
-- Integral(quot, rem, div, mod, quotRem, divMod, toInteger),
Integral(quot, rem, div, mod, quotRem, divMod, even, odd, toInteger, toInt),
- Fractional((/), recip, fromRational), fromDouble,
+ Fractional((/), recip, fromRational, fromDouble),
Floating(pi, exp, log, sqrt, (**), logBase, sin, cos, tan,
asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh),
RealFrac(properFraction, truncate, round, ceiling, floor),