19 #ifndef RAPIDJSON_DIYFP_H_ 20 #define RAPIDJSON_DIYFP_H_ 22 #include "../rapidjson.h" 25 #if defined(_MSC_VER) && defined(_M_AMD64) && !defined(__INTEL_COMPILER) 27 #pragma intrinsic(_BitScanReverse64) 28 #pragma intrinsic(_umul128) 36 RAPIDJSON_DIAG_OFF(effc++)
41 RAPIDJSON_DIAG_OFF(padded)
83 #if defined(_MSC_VER) && defined(_M_AMD64) 88 return DiyFp(h,
e + rhs.
e + 64);
89 #elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) 90 __extension__
typedef unsigned __int128 uint128;
91 uint128 p =
static_cast<uint128
>(
f) * static_cast<uint128>(rhs.
f);
96 return DiyFp(h,
e + rhs.
e + 64);
107 uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32);
109 return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32),
e + rhs.
e + 64);
116 #if defined(_MSC_VER) && defined(_M_AMD64) 118 _BitScanReverse64(&index,
f);
119 return DiyFp(
f << (63 - index),
e - (63 - index));
120 #elif defined(__GNUC__) && __GNUC__ >= 4 121 int s = __builtin_clzll(
f);
125 while (!(res.
f & (static_cast<uint64_t>(1) << 63)))
149 DiyFp pl =
DiyFp((
f << 1) + 1,
e - 1).NormalizeBoundary();
151 mi.
f <<= mi.
e - pl.
e;
173 return std::numeric_limits<double>::infinity();
198 static const uint64_t kCachedPowers_F[] = {
244 static const int16_t kCachedPowers_E[] = {
245 -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, -954, -927, -901, -874, -847, -821, -794, -768,
246 -741, -715, -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, -422, -396, -369, -343, -316, -289,
247 -263, -236, -210, -183, -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, 109, 136, 162, 189,
248 216, 242, 269, 295, 322, 348, 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, 641, 667,
249 694, 720, 747, 774, 800, 827, 853, 880, 907, 933, 960, 986, 1013, 1039, 1066
252 return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]);
258 double dk = (-61 -
e) * 0.30102999566398114 + 347;
259 int k =
static_cast<int>(dk);
263 unsigned index =
static_cast<unsigned>((k >> 3) + 1);
264 *K = -(-348 +
static_cast<int>(index << 3));
272 unsigned index =
static_cast<unsigned>(exp + 348) / 8u;
273 *outExp = -348 +
static_cast<int>(index) * 8;
283 RAPIDJSON_DIAG_OFF(padded)
289 #endif // RAPIDJSON_DIYFP_H_
#define RAPIDJSON_ASSERT(x)
Assertion.
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
static const int kDpExponentBias
DiyFp GetCachedPower10(int exp, int *outExp)
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
static const int kDiySignificandSize
DiyFp(uint64_t fp, int exp)
static const int kDpMaxExponent
static const uint64_t kDpSignificandMask
unsigned __int64 uint64_t
static const int kDpDenormalExponent
DiyFp operator*(const DiyFp &rhs) const
static const uint64_t kDpExponentMask
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
DiyFp NormalizeBoundary() const
static const int kDpMinExponent
DiyFp operator-(const DiyFp &rhs) const
void NormalizedBoundaries(DiyFp *minus, DiyFp *plus) const
DiyFp GetCachedPower(int e, int *K)
DiyFp GetCachedPowerByIndex(size_t index)
static const uint64_t kDpHiddenBit
static const int kDpSignificandSize