projects
/
ghc-base.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Adjust behaviour of gcd
[ghc-base.git]
/
GHC
/
Real.lhs
diff --git
a/GHC/Real.lhs
b/GHC/Real.lhs
index
fa70ded
..
51d7db4
100644
(file)
--- a/
GHC/Real.lhs
+++ b/
GHC/Real.lhs
@@
-43,7
+43,7
@@
default () -- Double isn't available yet,
\begin{code}
-- | Rational numbers, with numerator and denominator of some 'Integral' type.
\begin{code}
-- | Rational numbers, with numerator and denominator of some 'Integral' type.
-data (Integral a) => Ratio a = !a :% !a deriving (Eq)
+data Ratio a = !a :% !a deriving (Eq)
-- | Arbitrary-precision rational numbers, represented as a ratio of
-- two 'Integer' values. A rational number may be constructed using
-- | Arbitrary-precision rational numbers, represented as a ratio of
-- two 'Integer' values. A rational number may be constructed using
@@
-245,32
+245,38
@@
instance Integral Int where
a `quot` b
| b == 0 = divZeroError
a `quot` b
| b == 0 = divZeroError
- | b == (-1) && a == minBound = overflowError
+ | b == (-1) && a == minBound = overflowError -- Note [Order of tests]
+ -- in GHC.Int
| otherwise = a `quotInt` b
a `rem` b
| b == 0 = divZeroError
| otherwise = a `quotInt` b
a `rem` b
| b == 0 = divZeroError
- | b == (-1) && a == minBound = overflowError
+ | b == (-1) && a == minBound = overflowError -- Note [Order of tests]
+ -- in GHC.Int
| otherwise = a `remInt` b
a `div` b
| b == 0 = divZeroError
| otherwise = a `remInt` b
a `div` b
| b == 0 = divZeroError
- | b == (-1) && a == minBound = overflowError
+ | b == (-1) && a == minBound = overflowError -- Note [Order of tests]
+ -- in GHC.Int
| otherwise = a `divInt` b
a `mod` b
| b == 0 = divZeroError
| otherwise = a `divInt` b
a `mod` b
| b == 0 = divZeroError
- | b == (-1) && a == minBound = overflowError
+ | b == (-1) && a == minBound = overflowError -- Note [Order of tests]
+ -- in GHC.Int
| otherwise = a `modInt` b
a `quotRem` b
| b == 0 = divZeroError
| otherwise = a `modInt` b
a `quotRem` b
| b == 0 = divZeroError
- | b == (-1) && a == minBound = overflowError
+ | b == (-1) && a == minBound = overflowError -- Note [Order of tests]
+ -- in GHC.Int
| otherwise = a `quotRemInt` b
a `divMod` b
| b == 0 = divZeroError
| otherwise = a `quotRemInt` b
a `divMod` b
| b == 0 = divZeroError
- | b == (-1) && a == minBound = overflowError
+ | b == (-1) && a == minBound = overflowError -- Note [Order of tests]
+ -- in GHC.Int
| otherwise = a `divModInt` b
\end{code}
| otherwise = a `divModInt` b
\end{code}
@@
-514,11
+520,10
@@
x ^^ n = if n >= 0 then x^n else recip (x^(negate n))
in if even e then (nn :% dd) else (negate nn :% dd)
-------------------------------------------------------
in if even e then (nn :% dd) else (negate nn :% dd)
-------------------------------------------------------
--- | @'gcd' x y@ is the greatest (positive) integer that divides both @x@
+-- | @'gcd' x y@ is the greatest (nonnegative) integer that divides both @x@
-- and @y@; for example @'gcd' (-3) 6@ = @3@, @'gcd' (-3) (-6)@ = @3@,
-- and @y@; for example @'gcd' (-3) 6@ = @3@, @'gcd' (-3) (-6)@ = @3@,
--- @'gcd' 0 4@ = @4@. @'gcd' 0 0@ raises a runtime error.
+-- @'gcd' 0 4@ = @4@. @'gcd' 0 0@ = @0@.
gcd :: (Integral a) => a -> a -> a
gcd :: (Integral a) => a -> a -> a
-gcd 0 0 = error "Prelude.gcd: gcd 0 0 is undefined"
gcd x y = gcd' (abs x) (abs y)
where gcd' a 0 = a
gcd' a b = gcd' b (a `rem` b)
gcd x y = gcd' (abs x) (abs y)
where gcd' a 0 = a
gcd' a b = gcd' b (a `rem` b)
@@
-533,16
+538,11
@@
lcm x y = abs ((x `quot` (gcd x y)) * y)
#ifdef OPTIMISE_INTEGER_GCD_LCM
{-# RULES
"gcd/Int->Int->Int" gcd = gcdInt
#ifdef OPTIMISE_INTEGER_GCD_LCM
{-# RULES
"gcd/Int->Int->Int" gcd = gcdInt
-"gcd/Integer->Integer->Integer" gcd = gcdInteger'
+"gcd/Integer->Integer->Integer" gcd = gcdInteger
"lcm/Integer->Integer->Integer" lcm = lcmInteger
#-}
"lcm/Integer->Integer->Integer" lcm = lcmInteger
#-}
-gcdInteger' :: Integer -> Integer -> Integer
-gcdInteger' 0 0 = error "GHC.Real.gcdInteger': gcd 0 0 is undefined"
-gcdInteger' a b = gcdInteger a b
-
gcdInt :: Int -> Int -> Int
gcdInt :: Int -> Int -> Int
-gcdInt 0 0 = error "GHC.Real.gcdInt: gcd 0 0 is undefined"
gcdInt a b = fromIntegral (gcdInteger (fromIntegral a) (fromIntegral b))
#endif
gcdInt a b = fromIntegral (gcdInteger (fromIntegral a) (fromIntegral b))
#endif