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)
34 RAPIDJSON_DIAG_OFF(effc++)
65 #if defined(_MSC_VER) && defined(_M_AMD64)
70 return DiyFp(h,
e + rhs.
e + 64);
71 #elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__)
72 __extension__
typedef unsigned __int128 uint128;
73 uint128 p =
static_cast<uint128
>(
f) * static_cast<uint128>(rhs.
f);
78 return DiyFp(h,
e + rhs.
e + 64);
89 uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32);
91 return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32),
e + rhs.
e + 64);
96 #if defined(_MSC_VER) && defined(_M_AMD64)
98 _BitScanReverse64(&index,
f);
99 return DiyFp(
f << (63 - index),
e - (63 - index));
100 #elif defined(__GNUC__) && __GNUC__ >= 4
101 int s = __builtin_clzll(
f);
105 while (!(res.
f & (static_cast<uint64_t>(1) << 63))) {
125 DiyFp pl =
DiyFp((
f << 1) + 1,
e - 1).NormalizeBoundary();
127 mi.
f <<= mi.
e - pl.
e;
160 static const uint64_t kCachedPowers_F[] = {
206 static const int16_t kCachedPowers_E[] = {
207 -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980,
208 -954, -927, -901, -874, -847, -821, -794, -768, -741, -715,
209 -688, -661, -635, -608, -582, -555, -529, -502, -475, -449,
210 -422, -396, -369, -343, -316, -289, -263, -236, -210, -183,
211 -157, -130, -103, -77, -50, -24, 3, 30, 56, 83,
212 109, 136, 162, 189, 216, 242, 269, 295, 322, 348,
213 375, 402, 428, 455, 481, 508, 534, 561, 588, 614,
214 641, 667, 694, 720, 747, 774, 800, 827, 853, 880,
215 907, 933, 960, 986, 1013, 1039, 1066
217 return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]);
223 double dk = (-61 - e) * 0.30102999566398114 + 347;
224 int k =
static_cast<int>(dk);
228 unsigned index =
static_cast<unsigned>((k >> 3) + 1);
229 *K = -(-348 +
static_cast<int>(index << 3));
235 unsigned index = (exp + 348) / 8;
236 *outExp = -348 + index * 8;
247 #endif // RAPIDJSON_DIYFP_H_
Quat exp(const Quat &q)
Definition: Quat.h:729
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
Definition: rapidjson.h:261
signed short int16_t
Definition: stdint.h:76
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
Definition: rapidjson.h:119
static const int kDpExponentBias
Definition: diyfp.h:146
DiyFp GetCachedPower10(int exp, int *outExp)
Definition: diyfp.h:234
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
Definition: rapidjson.h:116
static const int kDiySignificandSize
Definition: diyfp.h:144
DiyFp Normalize() const
Definition: diyfp.h:95
DiyFp(uint64_t fp, int exp)
Definition: diyfp.h:40
static const int kDpMaxExponent
Definition: diyfp.h:147
double ToDouble() const
Definition: diyfp.h:133
static const uint64_t kDpSignificandMask
Definition: diyfp.h:151
DiyFp()
Definition: diyfp.h:38
unsigned __int64 uint64_t
Definition: stdint.h:90
static const int kDpDenormalExponent
Definition: diyfp.h:149
DiyFp operator*(const DiyFp &rhs) const
Definition: diyfp.h:64
uint64_t f
Definition: diyfp.h:154
static const uint64_t kDpExponentMask
Definition: diyfp.h:150
Definition: document.h:390
DiyFp NormalizeBoundary() const
Definition: diyfp.h:113
static const int kDpMinExponent
Definition: diyfp.h:148
DiyFp operator-(const DiyFp &rhs) const
Definition: diyfp.h:60
int e
Definition: diyfp.h:155
void NormalizedBoundaries(DiyFp *minus, DiyFp *plus) const
Definition: diyfp.h:124
DiyFp GetCachedPower(int e, int *K)
Definition: diyfp.h:220
DiyFp GetCachedPowerByIndex(size_t index)
Definition: diyfp.h:158
DiyFp(double d)
Definition: diyfp.h:42
static const uint64_t kDpHiddenBit
Definition: diyfp.h:152
static const int kDpSignificandSize
Definition: diyfp.h:145