# Arithmetic functions

Arithmetic operators calculate numeric values. Their result and overflow behavior depend on whether the operands are legacy SQL numbers or exact native integers and decimals.

## Operators

| Operator | Calculation                                                                         |
| -------- | ----------------------------------------------------------------------------------- |
| `a + b`  | Addition.                                                                           |
| `a - b`  | Subtraction.                                                                        |
| `a * b`  | Multiplication.                                                                     |
| `a / b`  | Division; ordinary integer operands give an integer quotient truncated toward zero. |
| `a % b`  | Remainder.                                                                          |
| `-a`     | Negation.                                                                           |

SQL NULL operands propagate. Ordinary numeric division or remainder by zero returns NULL. Decimal division and remainder by zero instead raise `INVALID_ARGUMENT`.

Exact native numeric overflow raises an error. Legacy INTEGER arithmetic can promote an overflowing result to REAL. Cast explicitly when the exact numeric family matters.

## abs

Returns a number's magnitude:

```text
abs(value)
```

```sql
SELECT abs(-5), abs(CAST('-1.20' AS Decimal(18, 2)))
FORMAT csv;
```

```text
5,1.20
```

## mod and div

```text
mod(value, divisor)
div(value, divisor)
```

`mod` returns a remainder; ordinary numeric inputs return REAL, while Decimal inputs use exact decimal remainder. `div` returns an exact decimal integral quotient and rejects a zero divisor.

```sql
SELECT 7 / 2, 7 % 2, mod(7, 3), div(7, 2)
FORMAT csv;
```

```text
3,1,1.0,3
```

## Decimal arithmetic

Decimal addition and subtraction use the larger operand scale, multiplication adds scales, and division retains the left scale. Excess division digits are discarded toward zero. Convert approximate operands before combining them with Decimal.

```sql
SELECT CAST('7.00' AS Decimal(18, 2)) / 2
FORMAT csv;
```

```text
3.50
```

See [Decimal](https://coordinatordb.com/docs/reference/data-types/decimal) for ranges and conversions, and [mathematical functions](https://coordinatordb.com/docs/reference/functions/regular-functions/math-functions) for roots, powers and trigonometry.
