commit
f4e357f65d
@ -97,7 +97,7 @@ public:
|
|||||||
if (u == 1) return *this;
|
if (u == 1) return *this;
|
||||||
if (*this == 1) return *this = u;
|
if (*this == 1) return *this = u;
|
||||||
|
|
||||||
uint32_t k = 0;
|
uint64_t k = 0;
|
||||||
for (size_t i = 0; i < count_; i++) {
|
for (size_t i = 0; i < count_; i++) {
|
||||||
const uint64_t c = digits_[i] >> 32;
|
const uint64_t c = digits_[i] >> 32;
|
||||||
const uint64_t d = digits_[i] & 0xFFFFFFFF;
|
const uint64_t d = digits_[i] & 0xFFFFFFFF;
|
||||||
@ -246,7 +246,7 @@ private:
|
|||||||
__extension__ typedef unsigned __int128 uint128;
|
__extension__ typedef unsigned __int128 uint128;
|
||||||
uint128 p = static_cast<uint128>(a) * static_cast<uint128>(b);
|
uint128 p = static_cast<uint128>(a) * static_cast<uint128>(b);
|
||||||
p += k;
|
p += k;
|
||||||
*outHigh = p >> 64;
|
*outHigh = static_cast<uint64_t>(p >> 64);
|
||||||
return static_cast<uint64_t>(p);
|
return static_cast<uint64_t>(p);
|
||||||
#else
|
#else
|
||||||
const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32;
|
const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32;
|
||||||
|
@ -45,7 +45,7 @@ struct DiyFp {
|
|||||||
uint64_t u64;
|
uint64_t u64;
|
||||||
} u = { d };
|
} u = { d };
|
||||||
|
|
||||||
int biased_e = (u.u64 & kDpExponentMask) >> kDpSignificandSize;
|
int biased_e = static_cast<int>((u.u64 & kDpExponentMask) >> kDpSignificandSize);
|
||||||
uint64_t significand = (u.u64 & kDpSignificandMask);
|
uint64_t significand = (u.u64 & kDpSignificandMask);
|
||||||
if (biased_e != 0) {
|
if (biased_e != 0) {
|
||||||
f = significand + kDpHiddenBit;
|
f = significand + kDpHiddenBit;
|
||||||
@ -71,7 +71,7 @@ struct DiyFp {
|
|||||||
#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__)
|
#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__)
|
||||||
__extension__ typedef unsigned __int128 uint128;
|
__extension__ typedef unsigned __int128 uint128;
|
||||||
uint128 p = static_cast<uint128>(f) * static_cast<uint128>(rhs.f);
|
uint128 p = static_cast<uint128>(f) * static_cast<uint128>(rhs.f);
|
||||||
uint64_t h = p >> 64;
|
uint64_t h = static_cast<uint64_t>(p >> 64);
|
||||||
uint64_t l = static_cast<uint64_t>(p);
|
uint64_t l = static_cast<uint64_t>(p);
|
||||||
if (l & (uint64_t(1) << 63)) // rounding
|
if (l & (uint64_t(1) << 63)) // rounding
|
||||||
h++;
|
h++;
|
||||||
|
@ -23,29 +23,29 @@ namespace internal {
|
|||||||
class Double {
|
class Double {
|
||||||
public:
|
public:
|
||||||
Double() {}
|
Double() {}
|
||||||
Double(double d) : d(d) {}
|
Double(double d) : d_(d) {}
|
||||||
Double(uint64_t u) : u(u) {}
|
Double(uint64_t u) : u_(u) {}
|
||||||
|
|
||||||
double Value() const { return d; }
|
double Value() const { return d_; }
|
||||||
uint64_t Uint64Value() const { return u; }
|
uint64_t Uint64Value() const { return u_; }
|
||||||
|
|
||||||
double NextPositiveDouble() const {
|
double NextPositiveDouble() const {
|
||||||
RAPIDJSON_ASSERT(!Sign());
|
RAPIDJSON_ASSERT(!Sign());
|
||||||
return Double(u + 1).Value();
|
return Double(u_ + 1).Value();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Sign() const { return (u & kSignMask) != 0; }
|
bool Sign() const { return (u_ & kSignMask) != 0; }
|
||||||
uint64_t Significand() const { return u & kSignificandMask; }
|
uint64_t Significand() const { return u_ & kSignificandMask; }
|
||||||
int Exponent() const { return ((u & kExponentMask) >> kSignificandSize) - kExponentBias; }
|
int Exponent() const { return static_cast<int>(((u_ & kExponentMask) >> kSignificandSize) - kExponentBias); }
|
||||||
|
|
||||||
bool IsNan() const { return (u & kExponentMask) == kExponentMask && Significand() != 0; }
|
bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; }
|
||||||
bool IsInf() const { return (u & kExponentMask) == kExponentMask && Significand() == 0; }
|
bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; }
|
||||||
bool IsNormal() const { return (u & kExponentMask) != 0 || Significand() == 0; }
|
bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; }
|
||||||
bool IsZero() const { return (u & (kExponentMask | kSignificandMask)) == 0; }
|
bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; }
|
||||||
|
|
||||||
uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); }
|
uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); }
|
||||||
int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; }
|
int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; }
|
||||||
uint64_t ToBias() const { return (u & kSignMask) ? ~u + 1 : u | kSignMask; }
|
uint64_t ToBias() const { return (u_ & kSignMask) ? ~u_ + 1 : u_ | kSignMask; }
|
||||||
|
|
||||||
static unsigned EffectiveSignificandSize(int order) {
|
static unsigned EffectiveSignificandSize(int order) {
|
||||||
if (order >= -1021)
|
if (order >= -1021)
|
||||||
@ -66,8 +66,8 @@ private:
|
|||||||
static const uint64_t kHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000);
|
static const uint64_t kHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000);
|
||||||
|
|
||||||
union {
|
union {
|
||||||
double d;
|
double d_;
|
||||||
uint64_t u;
|
uint64_t u_;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user