12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- // Multiply rational numbers
- //
- // Input: tos-2 multiplicand
- //
- // tos-1 multiplier
- //
- // Output: product on stack
- #include "stdafx.h"
- #include "defs.h"
- void
- qmul(void)
- {
- unsigned int *aa, *bb, *c;
- save();
- p2 = pop();
- p1 = pop();
- // zero?
- if (MZERO(p1->u.q.a) || MZERO(p2->u.q.a)) {
- push(zero);
- restore();
- return;
- }
- aa = mmul(p1->u.q.a, p2->u.q.a);
- bb = mmul(p1->u.q.b, p2->u.q.b);
- c = mgcd(aa, bb);
- MSIGN(c) = MSIGN(bb);
- p1 = alloc();
- p1->k = NUM;
- p1->u.q.a = mdiv(aa, c);
- p1->u.q.b = mdiv(bb, c);
- mfree(aa);
- mfree(bb);
- mfree(c);
- push(p1);
- restore();
- }
|