[Oberon] Modulus on negative number

Chris Burrows chris at cfbsoftware.com
Sat May 13 14:26:53 CEST 2017


'completeness'? 'should be'? That statement needs some sort of context to have any validity. 

It is not true in the context of Oberon-07. As Peter has already stated - results for negative divisors are not defined in the language. The Astrobe for Cortex-M and Project Oberon RISC5 compilers will give you 'bad modulus' compilation errors for both statements in the following example:

VAR 
  i: INTEGER;
...  
... 
  i := 1 MOD (-12);
  i := -1 MOD (-12);

NOTE: If the parentheses are omitted they do not even parse as valid expressions.

Regards,
Chris Burrows
CFB Software
http://www.astrobe.com/RISC5


> -----Original Message-----
> From: Oberon [mailto:oberon-bounces at lists.inf.ethz.ch] On Behalf Of
> Jörg
> Sent: Saturday, 13 May 2017 6:43 PM
> To: ETH Oberon and related systems
> Subject: Re: [Oberon] Modulus on negative number
> 
> Hi
> 
> Just for completeness, the result should be
>    1 MOD -12 = -11
>   -1 MOD -12 = -1
> 
> J rg
> 
> > Am 13.05.2017 um 10:12 schrieb Peter Matthias
> <PeterMatthias at web.de>:
> >
> > Agreed. However, -1 MOD -12 or 1 MOD -12 is not defined in Oberon.
> >
> >
> > Am 12.05.2017 um 22:43 schrieb Aubrey McIntosh:
> >> for -1 MOD 12, the mathematically correct answers which are
> >> consistent with the language report, are q=-1, r=11.
> >>
> >> This definition works very well, for example, to implement wrap
> >> around strip chart displays.
> >>
> >>
> >> On Fri, May 12, 2017 at 2:28 PM, Peter Matthias
> <PeterMatthias at web.de
> >> <mailto:PeterMatthias at web.de>> wrote:
> >>
> >>    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
> >>            <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
> >>
> >>    --
> >>    Oberon at lists.inf.ethz.ch <mailto:Oberon at lists.inf.ethz.ch>
> mailing
> >>    list for ETH Oberon and related systems
> >>    https://lists.inf.ethz.ch/mailman/listinfo/oberon
> >>    <https://lists.inf.ethz.ch/mailman/listinfo/oberon>
> >>
> >>
> >>
> >>
> >> --
> >> Aubrey McIntosh, Ph.D.
> >> 1502 Devon Circle
> >> Austin TX 78723
> >> (512) 348-7401
> >>
> >>
> >>
> >> --
> >> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related
> >> systems https://lists.inf.ethz.ch/mailman/listinfo/oberon
> >>
> > --
> > Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related
> > systems https://lists.inf.ethz.ch/mailman/listinfo/oberon
> 
> --
> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related
> systems https://lists.inf.ethz.ch/mailman/listinfo/oberon



More information about the Oberon mailing list