diff options
| -rw-r--r-- | BigInt.c | 85 | ||||
| -rw-r--r-- | BigInt.h | 7 |
2 files changed, 92 insertions, 0 deletions
@@ -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); +} @@ -37,4 +37,11 @@ usize B_bytes(BigInt x); usize B_bitwidth(BigInt x); char* B_tostr(MemoryManager *mm, BigInt x); +int B_eq(const BigInt x, const BigInt y); +int B_not_eq(const BigInt x, const BigInt y); +int B_lt(const BigInt x, const BigInt y); +int B_le(const BigInt x, const BigInt y); +int B_gt(const BigInt x, const BigInt y); +int B_ge(const BigInt x, const BigInt y); + #endif /* _BIGINT */ |
