decimal decimal::operator -=(const decimal& b) { if (b.isZero()) { return *this; } decimal& a = *this; const size_t w = a.length(); if (b.length() > w) { throw underflow_error("Negative values not allowed"); } bool borrow = false; for (size_t i = 0; i < w; i++) { digit d = a[i] - b[i] - (borrow ? 1 : 0); borrow = d < 0; a[i] = borrow ? 10 + d : d; } if (borrow) { throw underflow_error("Negative values not allowed"); } remove_lz(); return *this; }
decimal decimal::operator +=(const decimal& b) { if (isZero()) { *this = b; return *this; } else if (b.isZero()) { return *this; } decimal& a = *this; const size_t w = max(a.length(), b.length()); digits.resize(w + 1); bool carry = false; for (size_t i = 0; i < w; i++) { digit d = a[i] + b[i] + (carry ? 1 : 0); carry = d >= 10; a[i] = carry ? d - 10 : d; } if (carry) { a[w] = 1; } else { digits.resize(w); } return *this; }