Skip to content

Math and arithmetic functions

Arithmetic and math functions operate on numeric types. The generic parameter types (ANY_NUM, ANY_REAL, ANY_INT) describe the family of concrete types each accepts — see the generic-type table on the parent page. A return type shown as a generic type is resolved from the actual argument types at compile time.

FunctionParametersReturns
ABSX : ANY_NUMANY_NUM
SQRTX : ANY_REALANY_REAL
LNX : ANY_REALANY_REAL
LOGX : ANY_REALANY_REAL
EXPX : ANY_REALANY_REAL
SINX : ANY_REALANY_REAL
COSX : ANY_REALANY_REAL
TANX : ANY_REALANY_REAL
ASINX : ANY_REALANY_REAL
ACOSX : ANY_REALANY_REAL
ATANX : ANY_REALANY_REAL
ATAN2Y : ANY_REAL, X : ANY_REALANY_REAL
ADDIN : ANY_NUM (2+ args)ANY_NUM
SUBIN1 : ANY_NUM, IN2 : ANY_NUMANY_NUM
MULIN : ANY_NUM (2+ args)ANY_NUM
DIVIN1 : ANY_NUM, IN2 : ANY_NUMANY_NUM
MODIN1 : ANY_NUM, IN2 : ANY_NUMANY_INT
EXPTIN1 : ANY_NUM, IN2 : ANY_NUMANY_REAL
MOVEIN : ANYANY
ABS(X : ANY_NUM) : ANY_NUM
magnitude := ABS(-12); // 12
SQRT(X : ANY_REAL) : ANY_REAL
side := SQRT(area);

LN, LOG, EXP — logarithms and exponential

Section titled “LN, LOG, EXP — logarithms and exponential”
LN(X : ANY_REAL) : ANY_REAL // natural logarithm
LOG(X : ANY_REAL) : ANY_REAL // base-10 logarithm
EXP(X : ANY_REAL) : ANY_REAL // e raised to X
decay := EXP(-t / tau);
dB := 20.0 * LOG(ratio);

SIN, COS, TAN, ASIN, ACOS, ATAN — trigonometry

Section titled “SIN, COS, TAN, ASIN, ACOS, ATAN — trigonometry”

All take and return an ANY_REAL. Angles are in radians.

SIN(X : ANY_REAL) : ANY_REAL
COS(X : ANY_REAL) : ANY_REAL
TAN(X : ANY_REAL) : ANY_REAL
ASIN(X : ANY_REAL) : ANY_REAL
ACOS(X : ANY_REAL) : ANY_REAL
ATAN(X : ANY_REAL) : ANY_REAL
y := SIN(phase);
angle := ASIN(y); // inverse, result in radians
ATAN2(Y : ANY_REAL, X : ANY_REAL) : ANY_REAL

Returns the angle of the vector (X, Y), using the signs of both arguments to place the result in the correct quadrant.

heading := ATAN2(dy, dx);

ADD and MUL are variadic (two or more inputs); SUB and DIV take exactly two. For everyday expressions the arithmetic operators (+, -, *, /) are usually clearer.

ADD(IN : ANY_NUM, ...) : ANY_NUM // 2+ args
SUB(IN1 : ANY_NUM, IN2 : ANY_NUM) : ANY_NUM
MUL(IN : ANY_NUM, ...) : ANY_NUM // 2+ args
DIV(IN1 : ANY_NUM, IN2 : ANY_NUM) : ANY_NUM
total := ADD(a, b, c); // variadic sum
area := MUL(width, height);
MOD(IN1 : ANY_NUM, IN2 : ANY_NUM) : ANY_INT

Returns the integer remainder of IN1 / IN2.

remainder := MOD(value, 10); // last decimal digit
EXPT(IN1 : ANY_NUM, IN2 : ANY_NUM) : ANY_REAL

Raises IN1 to the power of IN2.

volume := EXPT(side, 3); // side ** 3
MOVE(IN : ANY) : ANY

Returns its input unchanged; used to make an explicit assignment/copy.

backup := MOVE(current);