[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