[M3devel] integer division/mod questions?
hendrik at topoi.pooq.com
hendrik at topoi.pooq.com
Sun Jan 17 21:34:06 CET 2010
On Sun, Jan 17, 2010 at 10:44:53AM +0000, Jay K wrote:
>
> -2147483648 div 2147483647 ?
> -2147483648 mod 2147483647 ?
>
> quotient = -1, remainer = -1 seems reasonable.
> 2147483647 * -1 + -1 == -2147483648
>
There are two kinds of binary integer arithmetic -- two's complement
and one's complement. In my experience, two's complement machines tend
to have the remainder being the same sign as the dividend; one's
complement machines semm to have a remainder the same sign as the
divisor.
One's complement machines are all but extinct these days.
>
> However, Modula-3 specifies div as rounding down, so
>
> -2147483648 div 2147483647 == -2
>
> and then
>
> http://www.modula3.com/cm3/doc/reference/arithmetic.html
>
> The value x DIV y is the floor of
> the quotient of x and y; that is, the maximum integer
> not exceeding the real number z such that z * y = x.
> For integers x and y, the value of x MOD y is
> defined to be x - y * (x DIV y).
>
>
> This means that for positive y, the value of x MOD y
> lies in the interval [0 .. y-1], regardless of
> the sign of x. For negative y, the value of
> x MOD y lies in the interval [y+1 .. 0], regardless
> of the sign of x.
And this is consistent with MOD producing a canonical representative of
an equivalence class modulo y. It's what's wanted for a lot of
algorithms. What it returns for negative y isn't as important, but
it is important to have positive MODuli for positive y no matter what
the sign of x is.
But it's not what most two's-complement processors produce naturally.
Having a MODulo operation that is mathematically well-behaved takes
extra effort on these machines.
And it's also important to have a remainder that corresponds to the
division operator. On two's complement machines you have to either
* use extra instructions to correct the result of the divide
instruction to correspond to the mathematically desirable MOD
operator, or
* Have a separate remainder operation that does correspond to
division.
On one's complement machines MOD will have the same effect as remainder.
On two's complement, different.
-- hendrik
More information about the M3devel
mailing list