This module implements rational numbers, consisting of a numerator num and a denominator den, both of type int. The denominator can not be 0.
Procs
proc initRational[T: SomeInteger](num, den: T): Rational[T]
 Create a new rational number. Source Edit
proc `//`[T](num, den: T): Rational[T]

A friendlier version of initRational. Example usage:
var x = 1//3 + 1//5
Source Edit proc `$`[T](x: Rational[T]): string
 Turn a rational number into a string. Source Edit
proc toRational[T: SomeInteger](x: T): Rational[T]
 Convert some integer x to a rational number. Source Edit
proc toRational(x: float; n: int = high(int) shr 32): Rational[int] {...}{. raises: [], tags: [].}

Calculates the best rational numerator and denominator that approximates to x, where the denominator is smaller than n (default is the largest possible int to give maximum resolution).
The algorithm is based on the theory of continued fractions.
import math, rationals for i in 1..10: let t = (10 ^ (i+3)).int let x = toRational(PI, t) let newPI = x.num / x.den echo x, " ", newPI, " error: ", PI  newPI, " ", t
Source Edit proc toFloat[T](x: Rational[T]): float
 Convert a rational number x to a float. Source Edit
proc toInt[T](x: Rational[T]): int
 Convert a rational number x to an int. Conversion rounds towards 0 if x does not contain an integer value. Source Edit
proc reduce[T: SomeInteger](x: var Rational[T])
 Reduce rational x. Source Edit
proc `+`[T](x, y: Rational[T]): Rational[T]
 Add two rational numbers. Source Edit
proc `+`[T](x: Rational[T]; y: T): Rational[T]
 Add rational x to int y. Source Edit
proc `+`[T](x: T; y: Rational[T]): Rational[T]
 Add int x to rational y. Source Edit
proc `+=`[T](x: var Rational[T]; y: Rational[T])
 Add rational y to rational x. Source Edit
proc `+=`[T](x: var Rational[T]; y: T)
 Add int y to rational x. Source Edit
proc ``[T](x: Rational[T]): Rational[T]
 Unary minus for rational numbers. Source Edit
proc ``[T](x, y: Rational[T]): Rational[T]
 Subtract two rational numbers. Source Edit
proc ``[T](x: Rational[T]; y: T): Rational[T]
 Subtract int y from rational x. Source Edit
proc ``[T](x: T; y: Rational[T]): Rational[T]
 Subtract rational y from int x. Source Edit
proc `=`[T](x: var Rational[T]; y: Rational[T])
 Subtract rational y from rational x. Source Edit
proc `=`[T](x: var Rational[T]; y: T)
 Subtract int y from rational x. Source Edit
proc `*`[T](x, y: Rational[T]): Rational[T]
 Multiply two rational numbers. Source Edit
proc `*`[T](x: Rational[T]; y: T): Rational[T]
 Multiply rational x with int y. Source Edit
proc `*`[T](x: T; y: Rational[T]): Rational[T]
 Multiply int x with rational y. Source Edit
proc `*=`[T](x: var Rational[T]; y: Rational[T])
 Multiply rationals y to x. Source Edit
proc `*=`[T](x: var Rational[T]; y: T)
 Multiply int y to rational x. Source Edit
proc reciprocal[T](x: Rational[T]): Rational[T]
 Calculate the reciprocal of x. (1/x) Source Edit
proc `/`[T](x, y: Rational[T]): Rational[T]
 Divide rationals x by y. Source Edit
proc `/`[T](x: Rational[T]; y: T): Rational[T]
 Divide rational x by int y. Source Edit
proc `/`[T](x: T; y: Rational[T]): Rational[T]
 Divide int x by Rational y. Source Edit
proc `/=`[T](x: var Rational[T]; y: Rational[T])
 Divide rationals x by y in place. Source Edit
proc `/=`[T](x: var Rational[T]; y: T)
 Divide rational x by int y in place. Source Edit
proc cmp(x, y: Rational): int
 Compares two rationals. Source Edit
proc `<`(x, y: Rational): bool
 Source Edit
proc `<=`(x, y: Rational): bool
 Source Edit
proc `==`(x, y: Rational): bool
 Source Edit
proc abs[T](x: Rational[T]): Rational[T]
 Source Edit
proc `div`[T: SomeInteger](x, y: Rational[T]): T
 Computes the rational truncated division. Source Edit
proc `mod`[T: SomeInteger](x, y: Rational[T]): Rational[T]
 Computes the rational modulo by truncated division (remainder). This is same as x  (x div y) * y. Source Edit
proc floorDiv[T: SomeInteger](x, y: Rational[T]): T

Computes the rational floor division.
Floor division is conceptually defined as floor(x / y). This is different from the div operator, which is defined as trunc(x / y). That is, div rounds towards 0 and floorDiv rounds down.
Source Edit proc floorMod[T: SomeInteger](x, y: Rational[T]): Rational[T]

Computes the rational modulo by floor division (modulo).
This is same as x  floorDiv(x, y) * y. This proc behaves the same as the % operator in python.
Source Edit proc hash[T](x: Rational[T]): Hash
 Computes hash for rational x Source Edit