# [Oberon] Modulus on negative number

Chris Burrows chris at cfbsoftware.com
Sun May 14 05:40:44 CEST 2017

```Yes - one could if one wanted to if they were designing a programming language but there are at least two possible negative consequences they should weigh up:

a) Enforcing conformity with that requirement could have a negative effect on the performance on some platforms of the much more common cases of DIV and MOD with positive y.

b) The definition could be inconsistent with the definitions used in other common programming languages. The resulting confusion could be the source of additional programming errors.

With reference to Modula-2, Wirth commented on DIV and MOD in a letter dated January 17, 1986 which was published in Issue #5 of Modus News, the Newsletter for the Modula-2 Users Association. You can download a copy from here:

http://www.cfbsoftware.com/Modula2/Modus.aspx

With reference to Oberon-07, note that DIV is NOT defined for *any* x and y. DIV (like MOD) is only defined for positive y in Oberon 07. The quotient is constrained similarly to the remainder:

<quote>
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

</quote>

Consequently, the Astrobe for Cortex-M and Project Oberon RISC5 compilers will result in a 'divisor must be > 0' or 'bad divisor' compilation error message for both statements in the following example:

i := 10 DIV (-2);
i := -10 DIV (-2);

Regards,
Chris

> -----Original Message-----
> From: Oberon [mailto:oberon-bounces at lists.inf.ethz.ch] On Behalf Of
> Claudio Nieder
> Sent: Saturday, 13 May 2017 11:11 PM
> To: ETH Oberon and related systems
> Subject: Re: [Oberon] Modulus on negative number
>
> Hi,
>
> One could say that r must be within 0 and y, or to state it more
> formally
>
> 0<=r<y for y>0
> y<r<=0 for y<0.
>
> This gives the possibility to have a remainder also for negative y so
> that the condition x = (x DIV y) * y + (x MOD y) is satisfied.
>
> 1 DIV -12 = -1; 1 MOD -12=-11 satisfying the condition 1 = (-1) * (-
> 12) + (-11)
>
> -1 DIV -12 = 0; -1 MOD 12= -1 satisfying the condition -1 = 0 * (-12)
> + (-1)
>
> Without this extension when y is negative then x DIV y is defined but
> x MOD y not.
>
> But as you say, in his definitions of Oberon as well as of Modula-2
> by stating 0<= r < y Wirth actually created this situation where DIV
> is defined for any x and y but MOD is not.
>
> claudio
>
> > On 13. May. 2017, at 14:26, Chris Burrows <chris at cfbsoftware.com>
> wrote:
> >
> > '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:
> >>>>
> >>>>
> >>>>   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?
> >>>>
> >>>>
> >>>>       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
> >
> > --
> > 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

```