qmul.cpp 601 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. // Multiply rational numbers
  2. //
  3. // Input: tos-2 multiplicand
  4. //
  5. // tos-1 multiplier
  6. //
  7. // Output: product on stack
  8. #include "stdafx.h"
  9. #include "defs.h"
  10. void
  11. qmul(void)
  12. {
  13. unsigned int *aa, *bb, *c;
  14. save();
  15. p2 = pop();
  16. p1 = pop();
  17. // zero?
  18. if (MZERO(p1->u.q.a) || MZERO(p2->u.q.a)) {
  19. push(zero);
  20. restore();
  21. return;
  22. }
  23. aa = mmul(p1->u.q.a, p2->u.q.a);
  24. bb = mmul(p1->u.q.b, p2->u.q.b);
  25. c = mgcd(aa, bb);
  26. MSIGN(c) = MSIGN(bb);
  27. p1 = alloc();
  28. p1->k = NUM;
  29. p1->u.q.a = mdiv(aa, c);
  30. p1->u.q.b = mdiv(bb, c);
  31. mfree(aa);
  32. mfree(bb);
  33. mfree(c);
  34. push(p1);
  35. restore();
  36. }