diff --git a/CHANGELOG b/CHANGELOG index 5931319..9d11e93 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -44,6 +44,7 @@ Version 0.9.0 prerelease (2009.11.01): uint FromString(const wchar_t * source, const Conv & conv, const wchar_t **, bool *) uint FromString(const std::string & string, const Conv & conv, const wchar_t **, bool *) uint FromString(const std::wstring & string, const Conv & conv, const wchar_t **, bool *) + * added: UInt::Sqrt() - a new algorithm for calculating the square root * changed: Factorial() is using the Gamma() function now * changed: Big::Div(ss2) Big::Mod(ss2) diff --git a/ttmath/ttmathbig.h b/ttmath/ttmathbig.h index 1cddf0e..f7a4680 100644 --- a/ttmath/ttmathbig.h +++ b/ttmath/ttmathbig.h @@ -1509,6 +1509,7 @@ public: } + private: #ifdef TTMATH_CONSTANTSGENERATOR diff --git a/ttmath/ttmathint.h b/ttmath/ttmathint.h index 260ad39..cc89064 100644 --- a/ttmath/ttmathint.h +++ b/ttmath/ttmathint.h @@ -534,6 +534,7 @@ public: } + /*! * * convertion methods diff --git a/ttmath/ttmathuint.h b/ttmath/ttmathuint.h index 0bc9a6a..7c6e5a8 100644 --- a/ttmath/ttmathuint.h +++ b/ttmath/ttmathuint.h @@ -2252,6 +2252,50 @@ public: } + /*! + square root + e.g. Sqrt(9) = 3 + ('digit-by-digit' algorithm) + */ + void Sqrt() + { + UInt bit, temp; + + if( IsZero() ) + return; + + UInt value(*this); + + SetZero(); + bit.SetZero(); + bit.table[value_size-1] = (TTMATH_UINT_HIGHEST_BIT >> 1); + + while( bit > value ) + bit.Rcr(2); + + while( !bit.IsZero() ) + { + temp = *this; + temp.Add(bit); + + if( value >= temp ) + { + value.Sub(temp); + Rcr(1); + Add(bit); + } + else + { + Rcr(1); + } + + bit.Rcr(2); + } + + TTMATH_LOG("UInt::Sqrt") + } + + /*! this method sets n first bits to value zero