X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fparanoidnumber.cpp;h=40071e15f89f7585562cdf741e43e51c3b7c5b08;hp=b2a66f47f2a77fab83bd72e89d0145e4f698340f;hb=71df61ab8ea302247ad35ccdc973bc8e0cafd5b1;hpb=1d179b93f6a1b2a4fe3823c26fba862c24bc5d6e diff --git a/src/paranoidnumber.cpp b/src/paranoidnumber.cpp index b2a66f4..40071e1 100644 --- a/src/paranoidnumber.cpp +++ b/src/paranoidnumber.cpp @@ -37,6 +37,12 @@ ParanoidNumber::ParanoidNumber(const string & str) : m_value(0), m_next() int dp = 0; int end = 0; + bool negate = str[0] == '-'; + if (negate) + { + dp++; + end++; + } while (str[dp] != '\0' && str[dp] != '.') { ++dp; @@ -45,7 +51,7 @@ ParanoidNumber::ParanoidNumber(const string & str) : m_value(0), m_next() while (str[end] != '\0') ++end; ParanoidNumber m(1); - for (int i = dp-1; i >= 0; --i) + for (int i = dp-1; i >= negate; --i) { ParanoidNumber b(str[i]-'0'); b*=m; @@ -60,6 +66,14 @@ ParanoidNumber::ParanoidNumber(const string & str) : m_value(0), m_next() b*=n; this->operator+=(b); } + + if (negate) + Negate(); + + #ifdef PARANOID_COMPARE_EPSILON + double d = strtod(str.c_str(), NULL); + CompareForSanity(d, d); + #endif } ParanoidNumber & ParanoidNumber::operator=(const ParanoidNumber & a) @@ -916,6 +930,12 @@ bool ParanoidNumber::SanityCheck(set & visited) const return true; } +void ParanoidNumber::Negate() +{ + swap(m_next[ADD], m_next[SUBTRACT]); + m_value = -m_value; +} + #ifdef PARANOID_USE_ARENA void * ParanoidNumber::operator new(size_t s)