```Search                        Top                                  Index
```
```HELP MOD                                      A. Sloman March 1987

<number> mod <number> -> <number>

MOD is an infix operator (precedence 2) which returns the "modulus" of
the first number with respect to the second. It is partly similar to
REM, which returns the remainder. REM is guaranteed to produce a result
with the same sign as its first argument, MOD with the same sign as its
second argument. So MOD and REM can give different results
for negative arguments:

10 mod 3   =  1     (= 10 rem 3)

-10 mod 3  =  2     -10 rem 3  = -1

10 mod -3  = -2     10 rem -3  =  1

-10 mod -3 = -1     (= -10 rem -3)

15 mod -5  = -5     15 rem -5  =  0

REM will never return a negative result when its first argument is
positive or a positive (non-zero) result when its first argument is
negative. MOD returns a result in the interval between its second
argument and 0. It can return the lower but not the upper bound of
this interval.

The definition of mod is, in effect:

define 2 x mod y -> result;
lvars x y result;
x // y -> -> result;
if result < 0 then
if y >= 0 then y + result else result endif
elseif y < 0 then
y + result
else
result
endif;
enddefine;

MOD can now be applied to all non-complex number types i.e. it is not
restricted to integers. So:

67.8 mod 11.1 =>
** 1.2

33_/8 mod 2 =>
** 1_/8

REM but not MOD can be applied to complex numbers.
sqrt(-1) mod 5 =>
;;; MISHAP - REAL NUMBER(S) NEEDED
;;; INVOLVING:  0 0.0_+:1.0
;;; DOING    :  < mod compile

MOD needs to check its arguments. If you know they are going to be
integers, you can use the fast_integer version FI_MOD instead.
See REF * FASTPROCS and HELP * EFFICIENCY.

See
REF * NUMBERS
for details of POP-11 number types and mathematical operations.