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