X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/19c5a468e9e35303ad67e40259885dededdcdafa..0aaa804e7019b8187e2d35dffba133b43af79533:/src/common/longlong.cpp diff --git a/src/common/longlong.cpp b/src/common/longlong.cpp index 9334dcc3f4..aa5207c3f8 100644 --- a/src/common/longlong.cpp +++ b/src/common/longlong.cpp @@ -134,6 +134,19 @@ wxLongLongWx& wxLongLongWx::Assign(double d) return *this; } +double wxLongLongWx::ToDouble() const +{ + double d = m_hi; + d *= 1.0 + (double)ULONG_MAX; + d += m_lo; + +#ifdef wxLONGLONG_TEST_MODE + wxASSERT( d == m_ll ); +#endif // wxLONGLONG_TEST_MODE + + return d; +} + wxLongLongWx wxLongLongWx::operator<<(int shift) const { wxLongLongWx ll(*this); @@ -779,9 +792,11 @@ wxULongLongWx& wxULongLongWx::operator*=(const wxULongLongWx& ll) // division +#define IS_MSB_SET(ll) ((ll.GetHi()) & (1 << (8*sizeof(long) - 1))) + void wxLongLongWx::Divide(const wxLongLongWx& divisorIn, wxLongLongWx& quotient, - wxLongLongWx& remainder) const + wxLongLongWx& remainderIO) const { if ((divisorIn.m_lo == 0) && (divisorIn.m_hi == 0)) { @@ -805,8 +820,7 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn, // all responsibility for using this code. // init everything - wxLongLongWx dividend = *this, - divisor = divisorIn; + wxULongLongWx dividend, divisor, remainder; quotient = 0l; remainder = 0l; @@ -819,17 +833,21 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn, // dividend = quotient*divisor + remainder // // with 0 <= abs(remainder) < abs(divisor) - bool negRemainder = dividend.m_hi < 0; + bool negRemainder = GetHi() < 0; bool negQuotient = false; // assume positive - if ( dividend.m_hi < 0 ) + if ( GetHi() < 0 ) { negQuotient = !negQuotient; - dividend = -dividend; + dividend = -*this; + } else { + dividend = *this; } - if ( divisor.m_hi < 0 ) + if ( divisorIn.GetHi() < 0 ) { negQuotient = !negQuotient; - divisor = -divisor; + divisor = -divisorIn; + } else { + divisor = divisorIn; } // check for some particular cases @@ -847,8 +865,6 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn, size_t nBits = 64u; wxLongLongWx d; - #define IS_MSB_SET(ll) ((ll.m_hi) & (1 << (8*sizeof(long) - 1))) - while ( remainder < divisor ) { remainder <<= 1; @@ -888,10 +904,12 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn, } } + remainderIO = remainder; + // adjust signs if ( negRemainder ) { - remainder = -remainder; + remainderIO = -remainderIO; } if ( negQuotient ) @@ -947,8 +965,6 @@ void wxULongLongWx::Divide(const wxULongLongWx& divisorIn, size_t nBits = 64u; wxULongLongWx d; - #define IS_MSB_SET(ll) ((ll.m_hi) & (1 << (8*sizeof(long) - 1))) - while ( remainder < divisor ) { remainder <<= 1;