Re: Division, remainder, and rounding functions
Thanks Joe! I still don't know why anyone would want the 'divTruncateRem' function and its derivatives, but ok, leave them there. Why not add division with "rounding" AWAY from zero as well. :-) /kent k (I've sent some detail comments directly to Joe.)
Division, remainder, and rounding functions
Joe, Your definition of divFloorRem (and probably divCeilingRem as well) doesn't seem to be quite right, because I end up with (-4) `mod` (-3) == -4 because divTruncateRem (-4) (-3) is (1,-1). The condition in the "if" should be something like signum r == -signum d rather than r0. (Something like this is in the definition of `mod` on page 89 in 1.2beta.) Stefan Kahrs
Re: Division, remainder, and rounding functions
I think the suggestion Joe has made about division is good, but I also think it is overkill! Let's not add even more things to the Prelude that are not going to be used. My opinions on this matter is: - have something which is efficiently implementable (i.e. close to what the hardware provides) as the primitive, which is what `div` is. - just add an extra function for what Kent wants, e.g. infix 7 `quo` x `quo` y = if x 0 then x `div` y - 1 elsse x `div` y or whatever is approproate. -- Lennart
Re: Division, remainder, and rounding functions
|Your definition of divFloorRem (and probably divCeilingRem as well) |doesn't seem to be quite right, because I end up with | (-4) `mod` (-3) == -4 |because divTruncateRem (-4) (-3) is (1,-1). | |The condition in the "if" should be something like | signum r == -signum d |rather than r0. (Something like this is in the definition of |`mod` on page 89 in 1.2beta.) | |Stefan Kahrs Right, thanks. I've committed the error of forgetting that the divisor can be negative. I did the rounding methods first, where the "divisor" is 1, and then did the division methods by (incorrect!) analogy. You'd think that after n years of struggling with with definitions like these, I'd be able to get them right! So, as you say, this can be fixed thus: divFloorRem n d = if signum r == - signum d then (q-1, r+d) else qr where qr@(q,r) = divTruncateRem n d divCeilingRem n d = if signum r == signum d then (q+1, r-d) else qr where qr@(q,r) = divTruncateRem n d Another way: divFloorRem n d = if r 0 then (q-1, r+d) else qr where qr@(q,r) = divTruncateRem n' d' (n', d') = if d 0 then ((-n),(-d)) else (n,d) divCeilingRem n d = if r 0 then (q+1, r-d) else qr where qr@(q,r) = divTruncateRem n' d' (n', d') = if d 0 then ((-n),(-d)) else (n,d) --Joe