summary refs log tree commit diff stats
path: root/tests/stdlib/trationals.nim
blob: 23c15b884193f3fe10f22cf6bd71326b5a382f9c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import rationals, math


var
  z = Rational[int](num: 0, den: 1)
  o = initRational(num = 1, den = 1)
  a = initRational(1, 2)
  b = -1 // -2
  m1 = -1 // 1
  tt = 10 // 2

doAssert(a == a)
doAssert( (a-a) == z)
doAssert( (a+b) == o)
doAssert( (a/b) == o)
doAssert( (a*b) == 1 // 4)
doAssert( (3/a) == 6 // 1)
doAssert( (a/3) == 1 // 6)
doAssert(a*b == 1 // 4)
doAssert(tt*z == z)
doAssert(10*a == tt)
doAssert(a*10 == tt)
doAssert(tt/10 == a)
doAssert(a-m1 == 3 // 2)
doAssert(a+m1 == -1 // 2)
doAssert(m1+tt == 16 // 4)
doAssert(m1-tt == 6 // -1)

doAssert(z < o)
doAssert(z <= o)
doAssert(z == z)
doAssert(cmp(z, o) < 0)
doAssert(cmp(o, z) > 0)

doAssert(o == o)
doAssert(o >= o)
doAssert(not(o > o))
doAssert(cmp(o, o) == 0)
doAssert(cmp(z, z) == 0)
doAssert(hash(o) == hash(o))

doAssert(a == b)
doAssert(a >= b)
doAssert(not(b > a))
doAssert(cmp(a, b) == 0)
doAssert(hash(a) == hash(b))

var x = 1//3

x *= 5//1
doAssert(x == 5//3)
x += 2 // 9
doAssert(x == 17//9)
x -= 9//18
doAssert(x == 25//18)
x /= 1//2
doAssert(x == 50//18)

var y = 1//3

y *= 4
doAssert(y == 4//3)
y += 5
doAssert(y == 19//3)
y -= 2
doAssert(y == 13//3)
y /= 9
doAssert(y == 13//27)

doAssert toRational(5) == 5//1
doAssert abs(toFloat(y) - 0.4814814814814815) < 1.0e-7
doAssert toInt(z) == 0

when sizeof(int) == 8:
  doAssert toRational(0.98765432) == 2111111029 // 2137499919
  doAssert toRational(PI) == 817696623 // 260280919
when sizeof(int) == 4:
  doAssert toRational(0.98765432) == 80 // 81
  doAssert toRational(PI) == 355 // 113

doAssert toRational(0.1) == 1 // 10
doAssert toRational(0.9) == 9 // 10

doAssert toRational(0.0) == 0 // 1
doAssert toRational(-0.25) == 1 // -4
doAssert toRational(3.2) == 16 // 5
doAssert toRational(0.33) == 33 // 100
doAssert toRational(0.22) == 11 // 50
doAssert toRational(10.0) == 10 // 1

doAssert (1//1) div (3//10) == 3
doAssert (-1//1) div (3//10) == -3
doAssert (3//10) mod (1//1) == 3//10
doAssert (-3//10) mod (1//1) == -3//10
doAssert floorDiv(1//1, 3//10) == 3
doAssert floorDiv(-1//1, 3//10) == -4
doAssert floorMod(3//10, 1//1) == 3//10
doAssert floorMod(-3//10, 1//1) == 7//10