Fix negation of `divMod`/`quotRem` results (fixes #8726)
High-level pseudo code of what the code was supposed to implement:
quotRem' :: Integer -> Integer -> (Integer,Integer)
quotRem' a b@(S# _)
| b < 0 = negFst . uncurry quotRem' . negSnd $ (a,b)
| otherwise = quotRemUI a (fromIntegral (abs b))
divMod' :: Integer -> Integer -> (Integer,Integer)
divMod' a b@(S# _)
| b < 0 = negSnd . uncurry divMod' . negBoth $ (a,b)
| otherwise = divModUI a (fromIntegral b)
negFst (q,r) = (-q,r)
negSnd (q,r) = ( q,-r)
negBoth (q,r) = (-q,-r)
-- quotRemUI and divModUI represent GMP's `mpz_{f,t}div_qr_ui()`
quotRemUI, divModUI :: Integer -> Word -> (Integer,Integer)
Signed-off-by:
Herbert Valerio Riedel <hvr@gnu.org>
Loading
Please register or sign in to comment