# Overview

Tower.js is an implementation of the Racket numeric tower in Typescript. It gives you the ability to use exact numbers, complex numbers, and arbitrary precision numbers. This library is based on the js-numbers library, originally written by dyoo.

## Installation

Tower.js can be installed using npm and used from either Javascript or Typescript files.

`npm install tower.js@latest`

## Types

Tower.js functions operate on `RacketNumber`

s.

`type RacketNumber = number | bigint | BoxedNumber;`

It can either be a `number`

, `bigint`

, or one of the number classes. Boxed numbers are
either `InexactNumber`

, `SmallExactNumber`

, `BigExactNumber`

, or `ComplexNumber`

. The difference
between `SmallExactNumber`

and `BigExactNumber`

is that `BigExactNumber`

can be arbitrarily large and takes `bigint`

s in
the constructor. Tower.js will use unboxed `number`

s or `bigint`

s where possible
to increase performance.

## Usage

Tower.js implements many of the Racket numeric functions. For a full list of available functions and links to their corresponding Racket doc, go to the Functions page.

`import { `

fromString,

add,

subtract,

multiply,

divide

} from 'tower.js';

const one = fromString("1");

const two = add(one, one);

const three = add(one, one, one);

const one = subtract(three, two);

const six = multiply(three, two, one);

const five = divide(add(six, three, one), two);

Numbers are primarily created by parsing strings. The Racket string representation of a number will be parsed into it's Tower.js equivalent. For example:

`import { fromString } from 'tower.js';`

const exactFive = fromString('5');

const inexactFive = fromString('5.0');

const exactComplex = fromString('5+3i');

const inexactComplex = fromString('5.0+3.0i');

For more information on ways to create `RacketNumbers`

, see the Creation page.

## Example

Here is an example of factorial using Tower.js.

`import {`

RacketNumber,

numberToString,

fromString,

multiply,

subtract,

equals,

ZERO,

ONE,

} from 'tower.js';

function factorial(n: RacketNumber): RacketNumber {

if (equals(n, ZERO)) {

return ONE;

}

return multiply(n, subtract(n, ONE));

}

let result = factorial(fromString("5"));

console.log(numberToString(result)); // "20"

result = factorial(fromString("5.0"));

console.log(numberToString(result)); // "20.0"

result = factorial(fromString("5+3i"));

console.log(numberToString(result)); // "11+27i"