rationals
This module implements rational numbers, consisting of a numerator num
and a denominator den
, both of type int. The denominator can not be 0.
Imports
Types
Rational[T] = object num*, den*: T
- a rational number, consisting of a numerator and denominator Source Edit
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 thann
(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 ifx
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 inty
. Source Edit proc `+`[T](x: T; y: Rational[T]): Rational[T]
- Add int
x
to rationaly
. Source Edit proc `+=`[T](x: var Rational[T]; y: Rational[T])
- Add rational
y
to rationalx
. Source Edit proc `+=`[T](x: var Rational[T]; y: T)
- Add int
y
to rationalx
. 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 rationalx
. Source Edit proc `-`[T](x: T; y: Rational[T]): Rational[T]
- Subtract rational
y
from intx
. Source Edit proc `-=`[T](x: var Rational[T]; y: Rational[T])
- Subtract rational
y
from rationalx
. Source Edit proc `-=`[T](x: var Rational[T]; y: T)
- Subtract int
y
from rationalx
. 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 inty
. Source Edit proc `*`[T](x: T; y: Rational[T]): Rational[T]
- Multiply int
x
with rationaly
. Source Edit proc `*=`[T](x: var Rational[T]; y: Rational[T])
- Multiply rationals
y
tox
. Source Edit proc `*=`[T](x: var Rational[T]; y: T)
- Multiply int
y
to rationalx
. 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
byy
. Source Edit proc `/`[T](x: Rational[T]; y: T): Rational[T]
- Divide rational
x
by inty
. Source Edit proc `/`[T](x: T; y: Rational[T]): Rational[T]
- Divide int
x
by Rationaly
. Source Edit proc `/=`[T](x: var Rational[T]; y: Rational[T])
- Divide rationals
x
byy
in place. Source Edit proc `/=`[T](x: var Rational[T]; y: T)
- Divide rational
x
by inty
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
Source Editfloor(x / y)
. This is different from thediv
operator, which is defined astrunc(x / y)
. That is,div
rounds towards0
andfloorDiv
rounds down. proc floorMod[T: SomeInteger](x, y: Rational[T]): Rational[T]
-
Computes the rational modulo by floor division (modulo).
This is same as
Source Editx - floorDiv(x, y) * y
. This proc behaves the same as the%
operator in python. proc hash[T](x: Rational[T]): Hash
- Computes hash for rational
x
Source Edit
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/rationals.html