X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=GHC%2FReal.lhs;h=51d7db404cab4e09ca432662484dcafe941d47f6;hb=7a97ec4b12e1fbec5505f82032cf4dc435b5a60c;hp=fa70ded93d66135d63c439eabdfb06237c9026a6;hpb=5dac514410303675fe60985c502c2c2863da616c;p=ghc-base.git diff --git a/GHC/Real.lhs b/GHC/Real.lhs index fa70ded..51d7db4 100644 --- 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. -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 @@ -245,32 +245,38 @@ instance Integral Int where 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 - | 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 - | 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 - | 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 - | 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 - | b == (-1) && a == minBound = overflowError + | b == (-1) && a == minBound = overflowError -- Note [Order of tests] + -- in GHC.Int | 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) ------------------------------------------------------- --- | @'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@, --- @'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 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) @@ -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 -"gcd/Integer->Integer->Integer" gcd = gcdInteger' +"gcd/Integer->Integer->Integer" gcd = gcdInteger "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 0 0 = error "GHC.Real.gcdInt: gcd 0 0 is undefined" gcdInt a b = fromIntegral (gcdInteger (fromIntegral a) (fromIntegral b)) #endif