# Mathematics in Toit#

Find mathematical algorithms in the math module, and the numbers available in the numbers module of the core library.

## Numbers#

Toit numbers support integers and floats.

### Integers and floats#

Integers are whole numbers such as -1, 0, 1, 2, 3, .. and they have type `int`. Floats are numbers with a decimal point. Floats are contagious, meaning that any binary operation involving a float forces the other operand to be converted to a float before doing the operation (thus yielding a float as result).

Integers are 64-bit signed integers. Floats are of size 64-bit, following the IEEE 754-1985 double format.

To make large numbers more readable, digits are often grouped using underscores. When storing these values and when displaying them on screen, Toit just ignores the underscores.

Underscores work for both integers and floats.

You can use the mathematics operators such as `+`, `-`, `*`, and `/` to form expressions that include numbers. The int class has additional operations (like bit-shifting) that are not supported by the floating point numbers.

Additional mathematical constants and functions are available in the math module.

``````import math

main:
print (math.pow 2 10)
``````

## Randomization#

`random` is a function included in the core library.

`random 10` gives you a random number between 0 and 10 (10 exclusive).

`random 3 5` gives you a random number between 3 and 5 (5 exclusive).

## Range#

To create a range similar to the built-in function in Python:

``````range from/int to/int step=1 [block]:
if step > 0:
for i := from; i < to; i += step:
block.call i
else:
for i := from; i > to; i += step:
block.call i

main:
range 5 10:
print it  // Logs 5, 6, 7, 8, 9.
range 10 20 2:
print it  // Logs 10, 12, 14, 16, 18.
``````

## Sorting#

`sort` is a method of the class List.

To sort a list of numbers from biggest to smallest number and extract the smallest number

``````main:
list := [3, 2, 5, 1]
sorted := list.sort
print sorted
``````

If the list should be sorted in place, avoiding the allocation of a fresh list

``````main:
list := [3, 2, 5, 1]
list.sort --in_place
print list.first
``````

To get the highest number of the sorted list

``````  print list.last
``````

It is also possible to sort with a custom comparison by passing a block to the `sort` function

``````main:
my_list := [1, 2, 5, 9]
my_list.sort --in_place: | a b | b - a
print my_list
``````

The block takes two arguments, which are here called `a` and `b` and should return (implicitly) a value that can be negative, zero, or positive. Note that `| b -a | sorts in descending order.

## Sums#

The Toit language has some features normally used in functional languages. One of those is the reduce function, which combines all the elements using a custom combiner.

To add all the number in a list

``````  sum := my_list.reduce: | a b | a + b
``````

To get the largest

``````  largest := my_list.reduce: | a b | max a b
``````

Note that it is still possible to code in a more traditional way such as

``````  largest2 := my_list
for i := 1; i < my_list.size; i++:
largest2 = max largest2 my_list[i]
``````