qsub.cpp 663 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // Subtract rational numbers
  2. //
  3. // Input: tos-2 minuend
  4. //
  5. // tos-1 subtrahend
  6. //
  7. // Output: difference on stack
  8. #include "stdafx.h"
  9. #include "defs.h"
  10. void
  11. qsub(void)
  12. {
  13. unsigned int *a, *ab, *b, *ba, *c;
  14. save();
  15. p2 = pop();
  16. p1 = pop();
  17. ab = mmul(p1->u.q.a, p2->u.q.b);
  18. ba = mmul(p1->u.q.b, p2->u.q.a);
  19. a = msub(ab, ba);
  20. mfree(ab);
  21. mfree(ba);
  22. // zero?
  23. if (MZERO(a)) {
  24. mfree(a);
  25. push(zero);
  26. restore();
  27. return;
  28. }
  29. b = mmul(p1->u.q.b, p2->u.q.b);
  30. c = mgcd(a, b);
  31. MSIGN(c) = MSIGN(b);
  32. p1 = alloc();
  33. p1->k = NUM;
  34. p1->u.q.a = mdiv(a, c);
  35. p1->u.q.b = mdiv(b, c);
  36. mfree(a);
  37. mfree(b);
  38. mfree(c);
  39. push(p1);
  40. restore();
  41. }