aboutsummaryrefslogtreecommitdiff
path: root/BigInt.c
diff options
context:
space:
mode:
Diffstat (limited to 'BigInt.c')
-rw-r--r--BigInt.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/BigInt.c b/BigInt.c
index 21c22d3..1e1a0db 100644
--- a/BigInt.c
+++ b/BigInt.c
@@ -565,3 +565,88 @@ B_tostr(MemoryManager *mm, BigInt intx) {
mm->free(*mm, (void**)&bcd);
return str;
}
+
+int
+B_eq(const BigInt intx, const BigInt inty) {
+ if (NULL == intx || NULL == inty)
+ return intx == inty;
+
+ struct BigIntMeta *xm = B_metadata(intx), *ym = B_metadata(inty);
+ UWord *x = intx, *y = inty;
+
+ usize words;
+ if (xm->words < ym->words) {
+ for (usize w = xm->words; w < ym->words; ++w)
+ if (y[w] != 0)
+ return 0;
+
+ words = xm->words;
+ }
+ else {
+ for (usize w = ym->words; w < xm->words; ++w)
+ if (x[w] != 0)
+ return 0;
+
+ words = ym->words;
+ }
+
+ for (usize w = words - 1; w < words; --w)
+ if (x[w] != y[w])
+ return 0;
+
+ return 1;
+}
+
+int
+B_not_eq(const BigInt x, const BigInt y) {
+ return !B_eq(x, y);
+}
+
+int
+B_lt(const BigInt intx, const BigInt inty) {
+ if (NULL == intx || NULL == inty)
+ return R_NullArgument;
+
+ struct BigIntMeta *xm = B_metadata(intx), *ym = B_metadata(inty);
+ UWord *x = (void*)intx, *y = (void*)inty;
+
+ usize words;
+ if (xm->words < ym->words) {
+ for (usize w = xm->words; w < ym->words; ++w)
+ if (y[w] != 0)
+ return 1;
+
+ words = xm->words;
+ }
+ else {
+ for (usize w = ym->words; w < xm->words; ++w)
+ if (x[w] != 0)
+ return 0;
+
+ words = ym->words;
+ }
+
+ for (usize w = words - 1; w < words; --w) {
+ if (x[w] < y[w])
+ return 1;
+ else if (x[w] > y[w])
+ return 0;
+ }
+
+ return 0;
+}
+
+int
+B_le(const BigInt x, const BigInt y) {
+ return B_lt(x, y) || B_eq(x, y);
+}
+
+int
+B_gt(const BigInt x, const BigInt y) {
+ return !B_lt(x, y) && !B_eq(x, y);
+}
+
+int
+B_ge(const BigInt x, const BigInt y) {
+ return !B_lt(x, y);
+}