Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / qsub.cpp
blobf918059484a0faa1d74c1941ecd7f56e003b7879
1 // Subtract rational numbers
2 //
3 // Input: tos-2 minuend
4 //
5 // tos-1 subtrahend
6 //
7 // Output: difference on stack
9 #include "stdafx.h"
10 #include "defs.h"
12 void
13 qsub(void)
15 unsigned int *a, *ab, *b, *ba, *c;
17 save();
19 p2 = pop();
20 p1 = pop();
22 ab = mmul(p1->u.q.a, p2->u.q.b);
23 ba = mmul(p1->u.q.b, p2->u.q.a);
25 a = msub(ab, ba);
27 mfree(ab);
28 mfree(ba);
30 // zero?
32 if (MZERO(a)) {
33 mfree(a);
34 push(zero);
35 restore();
36 return;
39 b = mmul(p1->u.q.b, p2->u.q.b);
41 c = mgcd(a, b);
43 MSIGN(c) = MSIGN(b);
45 p1 = alloc();
47 p1->k = NUM;
49 p1->u.q.a = mdiv(a, c);
50 p1->u.q.b = mdiv(b, c);
52 mfree(a);
53 mfree(b);
54 mfree(c);
56 push(p1);
58 restore();