~/bend-docscommunity

rational.bend checks

raw source on the hub · import 0xbf5d8bf07d7411858acb5142889fc4d7/rational.bend as Rational

Exact rational numbers over BigInt, always in lowest terms.

3 imports
import Base
import ./bigint.bend as Big
import ./decimal.bend as Dec

Types

type Rational source · line 9 · raw

Data

num / den with den > 0 and gcd(num, den) = 1, so zero is 0/1 and equal values are equal terms. Build one with make, from_bigint or from_decimal; the raw constructor does not normalize.

Definitions

def Rational.low source · line 12 · raw

@p:Pair(0xbf5d8bf07d7411858acb5142889fc4d7/bigint.BigInt, 0xbf5d8bf07d7411858acb5142889fc4d7/bigint.BigInt) -> Rational

def Rational.norm source · line 17 · raw

@n:0xbf5d8bf07d7411858acb5142889fc4d7/bigint.BigInt -> @d:0xbf5d8bf07d7411858acb5142889fc4d7/bigint.BigInt -> Rational

n / d for a nonzero d.

def Rational.from_bigint source · line 20 · raw

@n:0xbf5d8bf07d7411858acb5142889fc4d7/bigint.BigInt -> Rational

def Rational.make.if source · line 23 · raw

@z:Bool -> @n:0xbf5d8bf07d7411858acb5142889fc4d7/bigint.BigInt -> @d:0xbf5d8bf07d7411858acb5142889fc4d7/bigint.BigInt -> Maybe<&2, Rational>

def Rational.make source · line 32 · raw

@n:0xbf5d8bf07d7411858acb5142889fc4d7/bigint.BigInt -> @+d:0xbf5d8bf07d7411858acb5142889fc4d7/bigint.BigInt -> Maybe<&2, Rational>

n / d in lowest terms, or None when d is zero.

def Rational.from_decimal source · line 35 · raw

@d:0xbf5d8bf07d7411858acb5142889fc4d7/decimal.Decimal -> Rational

def Rational.to_decimal source · line 41 · raw

@r:Rational -> Maybe<&2, 0xbf5d8bf07d7411858acb5142889fc4d7/decimal.Decimal>

The exact decimal, or None when it repeats (den has a factor besides 2, 5).

def Rational.neg source · line 46 · raw

@r:Rational -> Rational

def Rational.is_zero source · line 51 · raw

@r:Rational -> Bool

def Rational.add source · line 56 · raw

@a:Rational -> @b:Rational -> Rational

def Rational.sub source · line 62 · raw

@a:Rational -> @b:Rational -> Rational

def Rational.mul source · line 65 · raw

@a:Rational -> @b:Rational -> Rational

def Rational.div source · line 71 · raw

@a:Rational -> @b:Rational -> Maybe<&2, Rational>

a / b, or None when b is zero.

def Rational.cmp source · line 77 · raw

@a:Rational -> @b:Rational -> Cmp

Denominators are positive, so cross-multiplying keeps the order.

def Rational.show.if source · line 82 · raw

@whole:Bool -> @n:0xbf5d8bf07d7411858acb5142889fc4d7/bigint.BigInt -> @d:0xbf5d8bf07d7411858acb5142889fc4d7/bigint.BigInt -> String

def Rational.show source · line 90 · raw

@r:Rational -> String

"n/d", or "n" when the denominator is 1.

def Rational.read.frac source · line 95 · raw

@a:Maybe<&2, 0xbf5d8bf07d7411858acb5142889fc4d7/bigint.BigInt> -> @b:Maybe<&2, 0xbf5d8bf07d7411858acb5142889fc4d7/bigint.BigInt> -> Maybe<&2, Rational>

def Rational.read.dec source · line 103 · raw

@m:Maybe<&2, 0xbf5d8bf07d7411858acb5142889fc4d7/decimal.Decimal> -> Maybe<&2, Rational>

def Rational.read.parts source · line 110 · raw

@ps:List<&2, String> -> Maybe<&2, Rational>

def Rational.read source · line 121 · raw

@s:String -> Maybe<&2, Rational>

"n/d" with BigInt sides (normalized; a zero d is None), or any number Decimal.read takes, such as "-1.25" or "3e-2".