This is actually an interesting question. Should we be truncating towards zero? I'd say yes, but then I tested Perl, Python and Tcl, and they all say that -27 % 7 is 1 which means they truncate towards negative infinity.
Too late to change at this point in the game, but perhaps it calls for a modulus() function which leans the other way? -Rasmus On Mon, 4 Mar 2003 [EMAIL PROTECTED] wrote: > ID: 22527 > Updated by: [EMAIL PROTECTED] > Reported By: jaypedhskr at aol dot com > -Status: Open > +Status: Bogus > Bug Type: Math related > Operating System: Unix > PHP Version: 4.2.3 > New Comment: > > Modulus has never been well-defined for negative values in computer > languages. It all comes down to whether the language truncates towards > zero or towards negative infinity. Computers have traditionally > truncated towards zero, whereas mathematicians tend to truncate towards > negative infinity. Some languages like Fortran and Ada actually have > two different modulus operators for this reason. PHP just has one, and > it truncates towards zero as has been the traditional and expected > thing for programming languages to do. > > So, given that, let's look at your numbers. Modulus has to satisfy the > relation: (a/b)*b + a%b = a > where a/b is an integer division where our truncation direction comes > in. > > (-27/7) * 7 + -27%7 = -27 > ( -3 ) * 7 + -27%7 = -27 > -21 + -27%7 = -27 > -27%7 = -27+21 > -27%7 = -6 > > In fact, the ISO standard for the C programming language, in which PHP > is written, defines integer division and modulus operators to perform > truncation towards 0 and not towards negative infinity. We don't > really have a strict language definition for PHP, but if we did, we > would most likely follow the lead of languages like Fortran, C and C++ > and specify truncation towards zero to be as consistent as possible > with other languages. > > > > Previous Comments: > ------------------------------------------------------------------------ > > [2003-03-03 22:29:46] jaypedhskr at aol dot com > > Hi, > > I had the following result from a PHP script, as seen from printing > output variables: > > -27 % 7 == -6 > > My understanding of the modulus function is that it returns the > remainder from division, and that the remainder can never be negative. > > I believe that is the standard mathematical definition. > > So I think what should have been returned is 1 instead of -6. > > That is > > -27 = 7*(-4) + 1 > > instead of > > -27 = 7*(-3) -6 > > I got around this by adding the the modulus value if the result was > less than zero. But I think a result of less than zero shouldn't > occur. > > Code snippet that ran into this: > > $T5 = $D + $T1 + $Y + $T2 + $T3 - $T4; > $weekday = $T5 % 7; > > Added code to handle this: > if ($weekday < 0) { > $weekday += 7; // -27 % 7 = -6 case > } > > Specific problem case: > $T5 = 3 + 2 + 3 + 5 + 0 - 40; // -27 > $weekday = %T5 % 7; // -27 % 7 = -6 > > Thanks! > > -Jay Pedersen > > > ------------------------------------------------------------------------ > > > -- > Edit this bug report at http://bugs.php.net/?id=22527&edit=1 > -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php