44 lines
501 B
CoffeeScript
44 lines
501 B
CoffeeScript
# Multiply rational numbers
|
|
#
|
|
# Input: tos-2 multiplicand
|
|
#
|
|
# tos-1 multiplier
|
|
#
|
|
# Output: product on stack
|
|
|
|
|
|
|
|
qmul = ->
|
|
save()
|
|
|
|
p2 = pop()
|
|
p1 = pop()
|
|
|
|
# zero?
|
|
|
|
if (MZERO(p1.q.a) || MZERO(p2.q.a))
|
|
push(zero)
|
|
restore()
|
|
return
|
|
|
|
aa = mmul(p1.q.a, p2.q.a)
|
|
bb = mmul(p1.q.b, p2.q.b)
|
|
|
|
c = mgcd(aa, bb)
|
|
|
|
c = makeSignSameAs(c,bb)
|
|
|
|
p1 = new U()
|
|
|
|
p1.k = NUM
|
|
|
|
p1.q.a = mdiv(aa, c)
|
|
p1.q.b = mdiv(bb, c)
|
|
|
|
#mfree(aa)
|
|
#mfree(bb)
|
|
|
|
push(p1)
|
|
|
|
restore()
|