qdiv.cpp 623 B

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