1 | # Add rational numbers
|
2 | #
|
3 | # Input: tos-2 addend
|
4 | #
|
5 | # tos-1 addend
|
6 | #
|
7 | # Output: sum on stack
|
8 |
|
9 |
|
10 |
|
11 | qadd = ->
|
12 | # a, ab, b, ba, c are all bigNum
|
13 |
|
14 | save()
|
15 |
|
16 | p2 = pop()
|
17 | p1 = pop()
|
18 |
|
19 | ab = mmul(p1.q.a, p2.q.b)
|
20 | ba = mmul(p1.q.b, p2.q.a)
|
21 |
|
22 | a = madd(ab, ba)
|
23 |
|
24 | #mfree(ab)
|
25 | #mfree(ba)
|
26 |
|
27 | # zero?
|
28 |
|
29 | if (MZERO(a))
|
30 | #mfree(a)
|
31 | push(zero)
|
32 | restore()
|
33 | return
|
34 |
|
35 | b = mmul(p1.q.b, p2.q.b)
|
36 |
|
37 | c = mgcd(a, b)
|
38 |
|
39 | c = makeSignSameAs(c,b)
|
40 |
|
41 | p1 = new U()
|
42 |
|
43 | p1.k = NUM
|
44 |
|
45 | p1.q.a = mdiv(a, c)
|
46 | p1.q.b = mdiv(b, c)
|
47 |
|
48 | #mfree(a)
|
49 | #mfree(b)
|
50 | #mfree(c)
|
51 |
|
52 | push(p1)
|
53 |
|
54 | restore()
|