Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / madd.cpp
blob38327e7461f0d01839ee3350b0dfd2d3b734e364
1 // Bignum addition and subtraction
3 #include "stdafx.h"
4 #include "defs.h"
6 static unsigned int *addf(unsigned int *, unsigned int *);
7 static unsigned int *subf(unsigned int *, unsigned int *);
8 static int ucmp(unsigned int *, unsigned int *);
10 unsigned int *
11 madd(unsigned int *a, unsigned int *b)
13 if (MSIGN(a) == MSIGN(b))
14 return addf(a, b); // same sign, add together
15 else
16 return subf(a, b); // opposite sign, find difference
19 unsigned int *
20 msub(unsigned int *a, unsigned int *b)
22 if (MSIGN(a) == MSIGN(b))
23 return subf(a, b); // same sign, find difference
24 else
25 return addf(a, b); // opposite sign, add together
28 static unsigned int *
29 addf(unsigned int *a, unsigned int *b)
31 int i, sign;
32 unsigned int c, *x;
34 sign = MSIGN(a);
36 if (MLENGTH(a) < MLENGTH(b)) {
37 x = a;
38 a = b;
39 b = x;
42 x = mnew(MLENGTH(a) + 1);
44 c = 0;
46 for (i = 0; i < MLENGTH(b); i++) {
47 x[i] = a[i] + b[i] + c;
48 if (c)
49 if (a[i] >= x[i])
50 c = 1;
51 else
52 c = 0;
53 else
54 if (a[i] > x[i])
55 c = 1;
56 else
57 c = 0;
60 for (i = MLENGTH(b); i < MLENGTH(a); i++) {
61 x[i] = a[i] + c;
62 if (a[i] > x[i])
63 c = 1;
64 else
65 c = 0;
68 x[MLENGTH(a)] = c;
70 for (i = MLENGTH(a); i > 0; i--)
71 if (x[i])
72 break;
74 MLENGTH(x) = i + 1;
75 MSIGN(x) = sign;
77 return x;
80 static unsigned int *
81 subf(unsigned int *a, unsigned int *b)
83 int i, sign = 0;
84 unsigned int c, *x;
86 switch (ucmp(a, b)) {
88 case 0:
89 return mint(0);
91 case 1:
92 sign = MSIGN(a); /* |a| > |b| */
93 break;
95 case -1:
96 sign = -MSIGN(a); /* |a| < |b| */
97 x = a;
98 a = b;
99 b = x;
100 break;
103 x = mnew(MLENGTH(a));
105 c = 0;
107 for (i = 0; i < MLENGTH(b); i++) {
108 x[i] = a[i] - b[i] - c;
109 if (c)
110 if (a[i] <= x[i])
111 c = 1;
112 else
113 c = 0;
114 else
115 if (a[i] < x[i])
116 c = 1;
117 else
118 c = 0;
121 for (i = MLENGTH(b); i < MLENGTH(a); i++) {
122 x[i] = a[i] - c;
123 if (a[i] < x[i])
124 c = 1;
125 else
126 c = 0;
129 for (i = MLENGTH(a) - 1; i > 0; i--)
130 if (x[i])
131 break;
133 MLENGTH(x) = i + 1;
134 MSIGN(x) = sign;
136 return x;
139 // unsigned compare
141 static int
142 ucmp(unsigned int *a, unsigned int *b)
144 int i;
146 if (MLENGTH(a) < MLENGTH(b))
147 return -1;
149 if (MLENGTH(a) > MLENGTH(b))
150 return 1;
152 for (i = MLENGTH(a) - 1; i > 0; i--)
153 if (a[i] != b[i])
154 break;
156 if (a[i] < b[i])
157 return -1;
159 if (a[i] > b[i])
160 return 1;
162 return 0;