fixed a bug which didn't see overflow cascade all the way up in subtraction

This commit is contained in:
Pagwin 2024-12-11 20:26:01 -05:00
parent 079b16c51e
commit 0af557f86e
No known key found for this signature in database
GPG key ID: 81137023740CA260

View file

@ -136,7 +136,7 @@ public:
friend Integer &abs_sub(Integer &lhs, Integer const &rhs) { friend Integer &abs_sub(Integer &lhs, Integer const &rhs) {
assert(abs_lt(rhs, lhs)); assert(abs_lt(rhs, lhs));
auto r_size = rhs.true_size(); auto r_size = rhs.true_size();
auto t_size = r_size + (lhs.true_size() > r_size ? 1 : 0); auto t_size = lhs.true_size();
bool overflow = false; bool overflow = false;
for (std::size_t i = 0; i < t_size; i++) { for (std::size_t i = 0; i < t_size; i++) {
byte to_sub = 0; byte to_sub = 0;
@ -144,12 +144,12 @@ public:
overflow = false; overflow = false;
if (r_size > i) { if (r_size > i) {
to_sub = rhs.bytes[i]; to_sub = rhs.bytes[i];
}
if (to_sub + overflow_handle > lhs.bytes[i] || if (to_sub + overflow_handle > lhs.bytes[i] ||
// overflow detection // overflow detection
(to_sub + overflow_handle == 0 && to_sub != 0)) { (to_sub + overflow_handle == 0 && to_sub != 0)) {
overflow = true; overflow = true;
} }
}
lhs.bytes[i] -= to_sub + overflow_handle; lhs.bytes[i] -= to_sub + overflow_handle;
} }
return lhs; return lhs;
@ -319,7 +319,7 @@ int main(void) {
} }
for (std::size_t i = 0; i <= 4500; i++) { for (std::size_t i = 0; i <= 4500; i++) {
Integer n = i; Integer n = i;
std::cout << n << std::endl; // std::cout << n << std::endl;
Integer base_n = n; Integer base_n = n;
n *= 1; n *= 1;
assert(n == base_n); assert(n == base_n);