[Oberon] Modulus on negative number

Peter Matthias PeterMatthias at web.de
Fri May 12 21:28:37 CEST 2017


Warming up the thread to give supposedly correct answer:

Am 16.02.2017 um 00:00 schrieb Peter Matthias:
>
>
> Am 15.02.2017 um 04:21 schrieb Srinivas Nayak:
>> Dear All,
>>
>> Recently I come across modulus on a negative number.
>> Will it produce a negative number or positive?
>> Someone says both are correct! http://stackoverflow.com/a/4403556
>> Which one is mathematically correct?
>> Surprisingly different languages calculate it differently even!
>> What is Oberon's way?
>
> The theory was already answered. In practice, all compiler
> implementations I used (native X86, Shark, MIPS), give wrong result when
> both, divident and divisor are negative. I fixed it just yesterday for
> all non x86 versions.

I should have read the language report before making such claims.

Oberon Report says:

"The operators DIV and MOD apply to integer operands only. They are 
related by the following formulas defined for any dividend x and 
positive divisors y:
x = (x DIV y) * y + (x MOD y)
0 ≤ (x MOD y) < y"

Oberon07-Report says:

"The operators DIV and MOD apply to integer operands only. Let q = x DIV 
y, and r = x MOD y.
Then quotient q and remainder r are defined by the equation
x = q*y + r		 0 <= r < y"

Last statement obviously cannot be met if y is negative.

So in short: Don't use DIV/MOD for negative divisors as the result is 
not defined.

 From the implemtation point of view this perfectly makes sense as 
negative divisors are seldom used and correction for DIV of the usually 
stupid hardware implementation only takes 3 additional instructions 
compared to at least 6 for a complete definition. Simple SHIFT/AND 
instructions for power of 2 divisors easily outwight these 3 additional 
instructions.

Peter



More information about the Oberon mailing list