1 | # Multiply rational numbers
|
2 | #
|
3 | # Input: tos-2 multiplicand
|
4 | #
|
5 | # tos-1 multiplier
|
6 | #
|
7 | # Output: product on stack
|
8 |
|
9 |
|
10 |
|
11 | qmul = ->
|
12 | save()
|
13 |
|
14 | p2 = pop()
|
15 | p1 = pop()
|
16 |
|
17 | # zero?
|
18 |
|
19 | if (MZERO(p1.q.a) || MZERO(p2.q.a))
|
20 | push(zero)
|
21 | restore()
|
22 | return
|
23 |
|
24 | aa = mmul(p1.q.a, p2.q.a)
|
25 | bb = mmul(p1.q.b, p2.q.b)
|
26 |
|
27 | c = mgcd(aa, bb)
|
28 |
|
29 | c = makeSignSameAs(c,bb)
|
30 |
|
31 | p1 = new U()
|
32 |
|
33 | p1.k = NUM
|
34 |
|
35 | p1.q.a = mdiv(aa, c)
|
36 | p1.q.b = mdiv(bb, c)
|
37 |
|
38 | #mfree(aa)
|
39 | #mfree(bb)
|
40 |
|
41 | push(p1)
|
42 |
|
43 | restore()
|