[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