Re: Division, remainder, and rounding functions

1992-02-17 Thread Kent Karlsson


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

1992-02-17 Thread smk

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

1992-02-17 Thread Lennart Augustsson


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

1992-02-17 Thread jhf

|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