Changeset 9856 for src/Pugs/Prim/Numeric.hs
- Timestamp:
- 04/06/06 15:44:58 (3 years ago)
- svk:copy_cache_prev:
- 13015
- Files:
-
- 1 modified
-
src/Pugs/Prim/Numeric.hs (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Prim/Numeric.hs
r9309 r9856 89 89 = if y' == 0 then err else return . VInt $ x' `mod` y' 90 90 | VInt x' <- x, VRat y' <- y 91 = if y' == 0 then err else return . V Int $ x' `mod` (truncate y')91 = if y' == 0 then err else return . VRat $ (x' % 1) `fmod` y' 92 92 | VRat x' <- x, VInt y' <- y 93 = if y' == 0 then err else return . V Int $ (truncate x') `mod` y'93 = if y' == 0 then err else return . VRat $ x' `fmod` (y' % 1) 94 94 | VRat x' <- x, VRat y' <- y 95 = if y' == 0 then err else return . VInt $ (truncate x') `mod` (truncate y') 96 | VRef ref <- x 97 = do 98 x' <- readRef ref 99 op2Modulus x' y 100 | VRef ref <- y 101 = do 102 y' <- readRef ref 103 op2Modulus x y' 95 = if y' == 0 then err else return . VRat $ x' `fmod` y' 104 96 | otherwise -- pray for the best 105 = op2 Int mod x y -- typeErr97 = op2Num fmod x y 106 98 where 107 99 err = fail "Illegal modulus zero" 100 fmod :: RealFrac a => a -> a -> a 101 fmod x y = let mod = x - (fromIntegral (truncate (x/y)) * y) in 102 if signum y * signum mod < 0 then mod + y else mod
