19 #ifndef RAPIDJSON_DIYFP_H_ 20 #define RAPIDJSON_DIYFP_H_ 22 #include "../rapidjson.h" 24 #if defined(_MSC_VER) && defined(_M_AMD64) 26 #pragma intrinsic(_BitScanReverse64) 27 #pragma intrinsic(_umul128) 35 RAPIDJSON_DIAG_OFF(effc++)
66 #if defined(_MSC_VER) && defined(_M_AMD64) 71 return DiyFp(h,
e + rhs.
e + 64);
72 #elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) 73 __extension__
typedef unsigned __int128 uint128;
74 uint128
p =
static_cast<uint128
>(
f) * static_cast<uint128>(rhs.
f);
79 return DiyFp(h,
e + rhs.
e + 64);
90 uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32);
92 return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32),
e + rhs.
e + 64);
97 #if defined(_MSC_VER) && defined(_M_AMD64) 99 _BitScanReverse64(&index,
f);
100 return DiyFp(
f << (63 - index),
e - (63 - index));
101 #elif defined(__GNUC__) && __GNUC__ >= 4 102 int s = __builtin_clzll(
f);
106 while (!(res.
f & (static_cast<uint64_t>(1) << 63))) {
126 DiyFp pl =
DiyFp((
f << 1) + 1,
e - 1).NormalizeBoundary();
128 mi.
f <<= mi.
e - pl.
e;
161 static const uint64_t kCachedPowers_F[] = {
207 static const int16_t kCachedPowers_E[] = {
208 -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980,
209 -954, -927, -901, -874, -847, -821, -794, -768, -741, -715,
210 -688, -661, -635, -608, -582, -555, -529, -502, -475, -449,
211 -422, -396, -369, -343, -316, -289, -263, -236, -210, -183,
212 -157, -130, -103, -77, -50, -24, 3, 30, 56, 83,
213 109, 136, 162, 189, 216, 242, 269, 295, 322, 348,
214 375, 402, 428, 455, 481, 508, 534, 561, 588, 614,
215 641, 667, 694, 720, 747, 774, 800, 827, 853, 880,
216 907, 933, 960, 986, 1013, 1039, 1066
218 return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]);
224 double dk = (-61 -
e) * 0.30102999566398114 + 347;
225 int k =
static_cast<int>(dk);
229 unsigned index =
static_cast<unsigned>((k >> 3) + 1);
230 *K = -(-348 +
static_cast<int>(index << 3));
236 unsigned index = (
static_cast<unsigned>(exp) + 348u) / 8u;
237 *outExp = -348 +
static_cast<int>(
index) * 8;
248 #endif // RAPIDJSON_DIYFP_H_
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
DiyFp(uint64_t fp, int exp)
static const int kDiySignificandSize
DiyFp operator*(const DiyFp &rhs) const
DiyFp GetCachedPower10(int exp, int *outExp)
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
DiyFp NormalizeBoundary() const
GLdouble GLdouble GLdouble b
static const uint64_t kDpExponentMask
void NormalizedBoundaries(DiyFp *minus, DiyFp *plus) const
static const int kDpSignificandSize
static const uint64_t kDpSignificandMask
unsigned __int64 uint64_t
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
static const int kDpMaxExponent
static const int kDpDenormalExponent
GLfloat GLfloat GLfloat GLfloat h
DiyFp operator-(const DiyFp &rhs) const
static const int kDpExponentBias
DiyFp GetCachedPower(int e, int *K)
DiyFp GetCachedPowerByIndex(size_t index)
static const int kDpMinExponent
GLboolean GLboolean GLboolean GLboolean a
static const uint64_t kDpHiddenBit