diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2015-02-28 00:29:43 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2015-02-28 00:29:43 +0100 |
commit | 549920a85f426fe7eaedafa68d29e04227997c5e (patch) | |
tree | 70ecb8493a0c579b7bd7767ed761fb6a232e0643 | |
parent | 3bfcfeb0cffa266b45f0803009787d7761881326 (diff) | |
parent | 4dbb58231103af07ea72e55a5196c33f63507808 (diff) | |
download | Nim-549920a85f426fe7eaedafa68d29e04227997c5e.tar.gz |
Merge pull request #2226 from def-/rationals
Rationals
-rw-r--r-- | lib/pure/rationals.nim | 62 |
1 files changed, 36 insertions, 26 deletions
diff --git a/lib/pure/rationals.nim b/lib/pure/rationals.nim index 40c61f1d9..04aa8316a 100644 --- a/lib/pure/rationals.nim +++ b/lib/pure/rationals.nim @@ -22,6 +22,16 @@ proc initRational*[T](num, den: T): Rational[T] = result.num = num result.den = den +proc `//`*[T](num, den: T): Rational[T] = initRational[T](num, den) + ## A friendlier version of `initRational`. Example usage: + ## + ## .. code-block:: nim + ## var x = 1//3 + 1//5 + +proc `$`*[T](x: Rational[T]): string = + ## Turn a rational number into a string. + result = $x.num & "/" & $x.den + proc toRational*[T](x: SomeInteger): Rational[T] = ## Convert some integer `x` to a rational number. result.num = x @@ -200,26 +210,26 @@ when isMainModule: z = Rational[int](num: 0, den: 1) o = initRational(num=1, den=1) a = initRational(1, 2) - b = initRational(-1, -2) - m1 = initRational(-1, 1) - tt = initRational(10, 2) + b = -1 // -2 + m1 = -1 // 1 + tt = 10 // 2 assert( a == a ) assert( (a-a) == z ) assert( (a+b) == o ) assert( (a/b) == o ) - assert( (a*b) == initRational(1, 4) ) - assert( (3/a) == initRational(6,1) ) - assert( (a/3) == initRational(1,6) ) - assert( a*b == initRational(1,4) ) + assert( (a*b) == 1 // 4 ) + assert( (3/a) == 6 // 1 ) + assert( (a/3) == 1 // 6 ) + assert( a*b == 1 // 4 ) assert( tt*z == z ) assert( 10*a == tt ) assert( a*10 == tt ) assert( tt/10 == a ) - assert( a-m1 == initRational(3, 2) ) - assert( a+m1 == initRational(-1, 2) ) - assert( m1+tt == initRational(16, 4) ) - assert( m1-tt == initRational(6, -1) ) + assert( a-m1 == 3 // 2 ) + assert( a+m1 == -1 // 2 ) + assert( m1+tt == 16 // 4 ) + assert( m1-tt == 6 // -1 ) assert( z < o ) assert( z <= o ) @@ -238,28 +248,28 @@ when isMainModule: assert( not(b > a) ) assert( cmp(a, b) == 0 ) - var x = initRational(1,3) + var x = 1//3 - x *= initRational(5,1) - assert( x == initRational(5,3) ) - x += initRational(2,9) - assert( x == initRational(17,9) ) - x -= initRational(9,18) - assert( x == initRational(25,18) ) - x /= initRational(1,2) - assert( x == initRational(50,18) ) + x *= 5//1 + assert( x == 5//3 ) + x += 2 // 9 + assert( x == 17//9 ) + x -= 9//18 + assert( x == 25//18 ) + x /= 1//2 + assert( x == 50//18 ) - var y = initRational(1,3) + var y = 1//3 y *= 4 - assert( y == initRational(4,3) ) + assert( y == 4//3 ) y += 5 - assert( y == initRational(19,3) ) + assert( y == 19//3 ) y -= 2 - assert( y == initRational(13,3) ) + assert( y == 13//3 ) y /= 9 - assert( y == initRational(13,27) ) + assert( y == 13//27 ) - assert toRational[int, int](5) == initRational(5,1) + assert toRational[int, int](5) == 5//1 assert abs(toFloat(y) - 0.4814814814814815) < 1.0e-7 assert toInt(z) == 0 |