X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fparanoidnumber.cpp;h=53729a324717a05ad2e9262c69f75925b6438175;hp=b11543e67054b65dd37739bc34978fac37d36307;hb=888817a67a9d840be66b52811b01eb77f10ff3e6;hpb=20788af97c06b76040ea2de5ab3ddc683a261365 diff --git a/src/paranoidnumber.cpp b/src/paranoidnumber.cpp index b11543e..53729a3 100644 --- a/src/paranoidnumber.cpp +++ b/src/paranoidnumber.cpp @@ -68,7 +68,6 @@ ParanoidNumber & ParanoidNumber::operator=(const ParanoidNumber & a) ParanoidNumber & ParanoidNumber::operator+=(const ParanoidNumber & a) { - if (m_next_factor == NULL && a.Floating()) { if (ParanoidOp(m_value, a.m_value, ADD)) @@ -237,7 +236,7 @@ void ParanoidNumber::SimplifyTerms() for (ParanoidNumber * a = this; a != NULL; a = a->m_next_term) { ParanoidNumber * b = a->m_next_term; - if (a->m_next_factor != NULL) + if (a->m_next_factor != NULL && !a->m_next_factor->Floating()) { continue; } @@ -247,14 +246,40 @@ void ParanoidNumber::SimplifyTerms() { //Debug("Simplify factors of %s", b->Str().c_str()); b->SimplifyFactors(); - if (b->m_next_factor != NULL) + if (b->m_next_factor != NULL && !b->m_next_factor->Floating()) { bprev = b; b = b->m_next_term; continue; } + bool simplify = false; - simplify = ParanoidOp(a->m_value, b->Head(), ADD); + if (a->m_next_factor != NULL || b->m_next_factor != NULL) + { + digit_t aa(a->Head()); + digit_t ab = (a->m_next_factor != NULL) ? a->m_next_factor->Head() : 1; + digit_t bc(b->Head()); + digit_t bd = (b->m_next_factor != NULL) ? b->m_next_factor->Head() : 1; + Optype aop = (a->m_next_factor != NULL) ? a->m_next_factor->m_op : DIVIDE; + Optype cop = (b->m_next_factor != NULL) ? b->m_next_factor->m_op : DIVIDE; + simplify = CombineTerms(aa, aop, ab, bc, cop, bd); + if (simplify) + { + a->m_value = aa; + if (a->m_next_factor != NULL) + a->m_next_factor->m_value = ab; + else if (ab != 1) + { + a->m_next_factor = b->m_next_factor; + b->m_next_factor = NULL; + a->m_next_factor->m_value = ab; + } + } + } + else + { + simplify = ParanoidOp(a->m_value, b->Head(), ADD); + } if (simplify) { bprev->m_next_term = b->m_next_term;