15 #ifndef RAPIDJSON_BIGINTEGER_H_
16 #define RAPIDJSON_BIGINTEGER_H_
18 #include "../rapidjson.h"
20 #if defined(_MSC_VER) && defined(_M_AMD64)
43 const size_t kMaxDigitPerIteration = 19;
44 while (length >= kMaxDigitPerIteration) {
46 length -= kMaxDigitPerIteration;
47 i += kMaxDigitPerIteration;
63 for (
size_t i = 0; i <
count_ - 1; i++) {
71 if (
digits_[count_ - 1] < backup)
78 if (u == 0)
return *
this = 0;
79 if (u == 1)
return *
this;
80 if (*
this == 1)
return *
this = u;
83 for (
size_t i = 0; i <
count_; i++) {
96 if (u == 0)
return *
this = 0;
97 if (u == 1)
return *
this;
98 if (*
this == 1)
return *
this = u;
101 for (
size_t i = 0; i <
count_; i++) {
107 const uint64_t p1 = uc + (p0 >> 32);
108 digits_[i] = (p0 & 0xFFFFFFFF) | (p1 << 32);
119 if (
IsZero() || shift == 0)
return *
this;
122 size_t interShift = shift %
kTypeBit;
125 if (interShift == 0) {
131 for (
size_t i =
count_; i > 0; i--)
139 std::memset(
digits_, 0, offset *
sizeof(Type));
159 5 * 5 * 5 * 5 * 5 * 5,
160 5 * 5 * 5 * 5 * 5 * 5 * 5,
161 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,
162 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,
163 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,
164 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,
165 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5
167 if (exp == 0)
return *
this;
169 for (; exp >= 13; exp -= 13) *
this *= static_cast<uint32_t>(1220703125u);
170 if (exp > 0) *
this *= kPow5[exp - 1];
181 if (cmp < 0) { a = &rhs; b =
this; ret =
true; }
182 else { a =
this; b = &rhs; ret =
false; }
185 for (
size_t i = 0; i < a->
count_; i++) {
186 Type d = a->
digits_[i] - borrow;
189 borrow = (d > a->
digits_[i]) ? 1 : 0;
202 for (
size_t i =
count_; i-- > 0;)
219 unsigned exp =
static_cast<unsigned>(end - begin);
231 for (
const char* p = begin; p != end; ++p) {
233 r = r * 10 + (*p -
'0');
240 #if defined(_MSC_VER) && defined(_M_AMD64)
241 uint64_t low = _umul128(a, b, outHigh) + k;
245 #elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__)
246 __extension__
typedef unsigned __int128 uint128;
247 uint128 p =
static_cast<uint128
>(a) * static_cast<uint128>(b);
249 *outHigh =
static_cast<uint64_t>(p >> 64);
252 const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32;
253 uint64_t x0 = a0 * b0, x1 = a0 * b1, x2 = a1 * b0, x3 = a1 * b1;
257 x3 += (
static_cast<uint64_t>(1) << 32);
258 uint64_t lo = (x1 << 32) + (x0 & 0xFFFFFFFF);
280 #endif // RAPIDJSON_BIGINTEGER_H_
static const size_t kCapacity
Definition: biginteger.h:270
BigInteger & operator<<=(size_t shift)
Definition: biginteger.h:118
Quat exp(const Quat &q)
Definition: Quat.h:729
BigInteger & operator+=(uint64_t u)
Definition: biginteger.h:60
bool IsZero() const
Definition: biginteger.h:211
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:344
Type GetDigit(size_t index) const
Definition: biginteger.h:210
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
Definition: rapidjson.h:261
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
Definition: rapidjson.h:119
void AppendDecimal64(const char *begin, const char *end)
Definition: biginteger.h:214
uint64_t Type
Definition: biginteger.h:29
BigInteger & operator=(uint64_t u)
Definition: biginteger.h:54
BigInteger & operator*=(uint32_t u)
Definition: biginteger.h:95
size_t GetCount() const
Definition: biginteger.h:209
int Compare(const BigInteger &rhs) const
Definition: biginteger.h:198
void PushBack(Type digit)
Definition: biginteger.h:224
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
Definition: rapidjson.h:116
BigInteger(const BigInteger &rhs)
Definition: biginteger.h:31
unsigned int uint32_t
Definition: stdint.h:80
static uint64_t MulAdd64(uint64_t a, uint64_t b, uint64_t k, uint64_t *outHigh)
Definition: biginteger.h:239
BigInteger(const char *decimals, size_t length)
Definition: biginteger.h:39
static uint64_t ParseUint64(const char *begin, const char *end)
Definition: biginteger.h:229
size_t count_
Definition: biginteger.h:274
BigInteger(uint64_t u)
Definition: biginteger.h:35
unsigned __int64 uint64_t
Definition: stdint.h:90
BigInteger & operator*=(uint64_t u)
Definition: biginteger.h:77
Type digits_[kCapacity]
Definition: biginteger.h:273
bool operator==(const Type rhs) const
Definition: biginteger.h:148
float length(float v)
Definition: vectorMath.h:208
Definition: document.h:390
static const size_t kTypeBit
Definition: biginteger.h:271
bool operator==(const BigInteger &rhs) const
Definition: biginteger.h:144
Definition: biginteger.h:27
static const size_t kBitCount
Definition: biginteger.h:269
BigInteger & MultiplyPow5(unsigned exp)
Definition: biginteger.h:152
bool Difference(const BigInteger &rhs, BigInteger *out) const
Definition: biginteger.h:176