reagan@hiyall.enet.dec.com (John R. Reagan) (03/01/90)
There was a recent discussion about DIV and MOD in Pascal. There was also some comment about how the standards committee got it "wrong". I asked someone on the Pascal committee at the time to recollect the events leading upto the current definition of DIV/MOD. Enjoy. -John Reagan, X3J9 Secretary To: John Reagan From: David Joslin February 26, 1990 Here are my recollections of the Pascal DIV/MOD debate (late seventies or early eighties, when we were standardizing classic Pascal). You can pass them on to Dave Jones & Charles Lindsey (I seem to remember that name) if you wish. 1. Jensen & Wirth (at the time - it's probably different now, after being edited by Jim Miner) did not consider or define DIV & MOD for anything other than positive operands; but it did call DIV "division with truncation" and "divide and truncate (i.e value is not rounded)". 2. The original working drafts defined DIV & MOD only for positive divisors and non-negative dividends - anything else was an error. 3. It was then considered essential to extend at least DIV to negative operands. There were two schools of thought: GROUP A (of which I was a member) were mainly concerned with extending DIV. They regarded it as essential that, for any I and J: (-I) div J = I div (-J) = -(I div J) (i) and this, together with the name "division with truncation", inevitably led to 14 div 3 = 4 , (-14) div 3 = -4 , 14 div (-3) = -4 , (-14) div (-3) = 4 . This definition was also compatible with other programming languages, notably Fortran, and they did not want to run the risk of programmer error by having the Pascal definition subtly different. (It is something like blank-padding or non-padding string comparison: the definition which is more aesthetically pleasing to some is outweighed by the compatibility advantages of the other.) They would have preferred to extend MOD by keeping (I div J) * J + I mod J = I (ii) for any I and J; or alternatively defining an additional operator REM such that, for any I and J, (I div J) * J + I rem J = I . (iii) This would give 14 rem 3 = 2 , (-14) rem 3 = -2 , 14 rem (-3) = 2 , (-14) rem (-3) = -2 , and have satisfied, for any I and J, (-I) rem J = -(I rem J) , I rem (-J) = I rem J (iv) GROUP B were mainly concerned with MOD, and maintained that since there was a mathematical operator called "modulo", the Pascal MOD should have the same definition, to avoid confusion. This would give 14 mod 3 = 2 , (-14) mod 3 = 1 , undefined for non-positive divisors. If DIV were then defined via equation (ii), as Jones and Lindsey presumably wished, equation (i) would no longer hold (and Pascal would be incompatible with Fortran etc). THE COMPROMISE was to define DIV according to the wishes of group A (for the reasons stated above), and MOD according to the wishes of group B (for compatibility with "modulo"). This had the result that equation (ii) only holds for positive operands - but then, MOD is not "remainder", so why should (ii) hold anyway? A BETTER COMPROMISE would have been to define DIV & MOD as per ISO 7185, but also introduce the operator REM as per equation (iii); we would then have had (i), (iii) & (iv) true for all operands, as well as (ii) true for positive operands. However the remit of ISO 7185 was not to extend Wirth's Pascal unless absolutely necessary, so this was not done. Someone could have suggested incorporating REM into Extended Pascal, but I forgot. As to Sun-3 4.3 Pascal getting DIV & MOD wrong (i.e different from the standard): presumably it will not pass the Pascal Validation Suite.