Paul Rubin wrote: > John Salerno <[EMAIL PROTECTED]> writes: > > Can someone explain to me why the expression 5 / -2 evaluates to -3, > > especially considering that -2 * -3 evaluates to 6? > > > > I'm sure it has something to do with the negative number and the > > current way that the / operator is implemented, but why doesn't it > > evaluate to -2 instead? > > Well, -2 * -2 is 4, which is not especially better than 6. The > reason for choosing -3 instead of -2 is so that if b is positive, > then a%b is non-negative even if a is negative. That is, the > motivating case is (-5 % 2) which is done the same way as (5 % -2).
As a more concrete example, consider the case of a Date class that stores dates as the number of days since an epoch, which happens to be a Sunday. To compute the day of the week a date falls on, you could use: SUNDAY, MONDAY, ..., SATURDAY = xrange(7) class Date: ... def weekday(self): return self.daycount % 7 But what about the day BEFORE the epoch, represented by -1? Case 1: Suppose that -1 // 7 == 0, as it is in C. In order to preserve that > You want (b*(a/b) + a%b)==a at all times. With a=-1, b=7, and a//b=0, this means (7*0 + a%b)==-1, which requires that -1 % 7 == -1. This doesn't correspond to any of the weekday constants, which means you'd have to rewrite your weekday() method if you wanted to handle negative dates. Case 2: Suppose that -1 // 7 = -1. Then (7*(-1) + -1%7)==-1, which means -1%7 happens to be 6. This says that the day before the epoch is a Saturday, which is exactly what you want. > Since a%b is positive, you can use it as a list index, etc. This isn't the best explanation, because negative list indices *are* allowed. -- http://mail.python.org/mailman/listinfo/python-list