[ Arithmetic | Reference Manual | Alphabetic Index ]

# mod(+Number1, +Number2, -Result)

Evaluates the modulus Number1 mod Number2 and unifies the resulting value with Result.
Number1
Integer.
Number2
Integer.
Result
Output: integer.

## Description

This predicate is used by the ECLiPSe compiler to expand evaluable arithmetic expressions. So the call to mod(Number1, Number2, Result) is equivalent to
```    Result is Number1 mod Number2
```
which should be preferred for portability.

The modulus operation computes the remainder corresponding to the flooring division div. The following relation always holds:

```    X =:= (X mod Y) + (X div Y) * Y.
```
The result Result is either zero, or has the same sign as Number2.

In coroutining mode, if Number1 or Number2 are uninstantiated, the call to mod/3 is delayed until these variables are instantiated.

CAUTION: The behaviour of mod was changed for standard compliance! In ECLiPSe versions up to 5.8, mod computed the remainder corresponding to the truncating division //, and thus gave different results for arguments with opposite signs. Moreover, the operator precedence was changed from op(300,xfx,mod) to op(400,yfx,mod), which means that a*b mod c is now parsed as (a*b)mod c rather than a*(b mod c).

### Modes and Determinism

• mod(+, +, -) is det

### Exceptions

(4) instantiation fault
Number1 or Number2 is not instantiated (non-coroutining mode only).
(5) type error
Number1 or Number2 is a number but not an integer.
(20) arithmetic exception
Illegal arithmetic operation: Number2 is zero
(24) number expected
Number1 or Number2 is not of a numeric type.

## Examples

```Success:
X is  10 mod  3.		% gives X =  1
X is -10 mod  3.		% gives X =  2
X is  10 mod -3.		% gives X = -2
X is -10 mod -3.		% gives X = -1

Error:
X is 2 mod 0.		% arithmetic exception
```