3.4. ARITHM: ЦЕЛОЧИСЛЕННАЯ АРИФМЕТИКА

$func "+" s.Int1 s.Int2 = s.Int;

$func "-" s.Int1 s.Int2 = s.Int;

$func "*" s.Int1 s.Int2 = s.Int;

$func DIV-REM s.Int1 s.Int2 = s.Quo s.Rem;

$func DIV s.Int1 s.Int2 = s.Quo;

$func REM s.Int1 s.Int2 = s.Rem;

$func GCD s.Int1 s.Int2 = s.Gcd;

Эти функции выполняют арифметические операции над целыми со знаком неограниченной разрядности. Каждый из аргументов арифметических функций должен представлять собой один символ-число.

Если хотя бы один из аргументов функций арифметики не является символом-числом, результатом является ошибка $error(Fname "Invalid argument"), где Fname - имя функции.

Если оба аргумента - числа, эти функции выдают следующие результаты.


"+" выдает сумму двух аргументов, "-" - разность первого и второго аргументов, "*" - произведение двух аргументов, DIV - результат деления нацело первого аргумента на второй, REM - остаток от деления нацело первого аргумента на второй, DIV-REM - результат деления нацело и остаток от деления нацело первого аргумента на второй, GCD - наибольший общий делитель двух аргументов.


Если результат одной из функций "+", "-" или "*" больше, чем допускается реализацией, результатом является ошибка $error(Fname "Size limit exceeded"), где Fname - имя функции.

Например:

<"+" 3 5> => 8

<"+" 3 -5> => -2

<"-" 3 -5> => 8

<"*" -2 3> => -6

<DIV 5 2> => 2

<REM 5 2> => 1

<DIV-REM 5 2> => 2 1

<DIV 6 2> => 3

<REM 6 2> => 0

<DIV-REM 6 2> => 3 0

Знаки частного и остатка определяются следующим образом.

Если знаки делимого и делителя совпадают - частное положительно, если различны - отрицательно. Знак остатка совпадает со знаком делимого. Таким образом, всегда выполняется соотношение

делимое = (частное * делитель) + остаток

Например:

<DIV 5 3> => 1

<REM 5 3> => 2

<DIV 5 -3> => -1

<REM 5 -3> => 2

<DIV -5 3> => -1

<REM -5 3> => -2

<DIV -5 -3> => 1

<REM -5 -3> => -2

Попытка делить на ноль приводит к выдаче ошибки $error(Fname "Divide by zero"), где Fname - имя функции. Например:

<DIV 5 0> => $error(DIV "Divide by zero")

<REM 5 0> => $error(REM "Divide by zero")

<DIV-REM 5 0> => $error(DIV-REM "Divide by zero")

Функция GCD, если ее оба аргумента не равны нулю одновременно, выдает положительное целое число, которое является наибольшим общим делителем аргументов. Если же оба аргумента равны нулю, результатом является ошибка $error(GCD "Zero arguments").

Например:

<GCD 6 15> => 3

<GCD -6 15> => 3

<GCD 15 1> => 1

<GCD 15 0> => 15

<GCD 0 0> => $error(GCD "Zero arguments")