All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Public Member Functions | Public Attributes | Static Public Attributes | List of all members
rapidjson::internal::DiyFp Struct Reference

#include <dtoa.h>

Public Member Functions

 DiyFp ()
 
 DiyFp (uint64_t f, int e)
 
 DiyFp (double d)
 
DiyFp operator- (const DiyFp &rhs) const
 
DiyFp operator* (const DiyFp &rhs) const
 
DiyFp Normalize () const
 
DiyFp NormalizeBoundary () const
 
void NormalizedBoundaries (DiyFp *minus, DiyFp *plus) const
 

Public Attributes

uint64_t f
 
int e
 

Static Public Attributes

static const int kDiySignificandSize = 64
 
static const int kDpSignificandSize = 52
 
static const int kDpExponentBias = 0x3FF + kDpSignificandSize
 
static const int kDpMinExponent = -kDpExponentBias
 
static const uint64_t kDpExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000)
 
static const uint64_t kDpSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF)
 
static const uint64_t kDpHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000)
 

Detailed Description

Definition at line 45 of file dtoa.h.

Constructor & Destructor Documentation

rapidjson::internal::DiyFp::DiyFp ( )
inline

Definition at line 46 of file dtoa.h.

46 {}
rapidjson::internal::DiyFp::DiyFp ( uint64_t  f,
int  e 
)
inline

Definition at line 48 of file dtoa.h.

48 : f(f), e(e) {}
rapidjson::internal::DiyFp::DiyFp ( double  d)
inline

Definition at line 50 of file dtoa.h.

50  {
51  union {
52  double d;
53  uint64_t u64;
54  } u = { d };
55 
56  int biased_e = static_cast<int>((u.u64 & kDpExponentMask) >> kDpSignificandSize);
57  uint64_t significand = (u.u64 & kDpSignificandMask);
58  if (biased_e != 0) {
59  f = significand + kDpHiddenBit;
60  e = biased_e - kDpExponentBias;
61  }
62  else {
63  f = significand;
64  e = kDpMinExponent + 1;
65  }
66  }
static const int kDpMinExponent
Definition: dtoa.h:151
static const int kDpExponentBias
Definition: dtoa.h:150
static const uint64_t kDpSignificandMask
Definition: dtoa.h:153
unsigned __int64 uint64_t
Definition: stdint.h:132
static const uint64_t kDpExponentMask
Definition: dtoa.h:152
static const uint64_t kDpHiddenBit
Definition: dtoa.h:154
static const int kDpSignificandSize
Definition: dtoa.h:149

Member Function Documentation

DiyFp rapidjson::internal::DiyFp::Normalize ( ) const
inline

Definition at line 102 of file dtoa.h.

102  {
103 #if defined(_MSC_VER) && defined(_M_AMD64)
104  unsigned long index;
105  _BitScanReverse64(&index, f);
106  return DiyFp(f << (63 - index), e - (63 - index));
107 #elif defined(__GNUC__)
108  int s = __builtin_clzll(f);
109  return DiyFp(f << s, e - s);
110 #else
111  DiyFp res = *this;
112  while (!(res.f & kDpHiddenBit)) {
113  res.f <<= 1;
114  res.e--;
115  }
116  res.f <<= (kDiySignificandSize - kDpSignificandSize - 1);
117  res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 1);
118  return res;
119 #endif
120  }
static const int kDiySignificandSize
Definition: dtoa.h:148
static const uint64_t kDpHiddenBit
Definition: dtoa.h:154
static const int kDpSignificandSize
Definition: dtoa.h:149
static const double s
Definition: Units.h:99
DiyFp rapidjson::internal::DiyFp::NormalizeBoundary ( ) const
inline

Definition at line 122 of file dtoa.h.

122  {
123 #if defined(_MSC_VER) && defined(_M_AMD64)
124  unsigned long index;
125  _BitScanReverse64(&index, f);
126  return DiyFp (f << (63 - index), e - (63 - index));
127 #else
128  DiyFp res = *this;
129  while (!(res.f & (kDpHiddenBit << 1))) {
130  res.f <<= 1;
131  res.e--;
132  }
133  res.f <<= (kDiySignificandSize - kDpSignificandSize - 2);
134  res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 2);
135  return res;
136 #endif
137  }
static const int kDiySignificandSize
Definition: dtoa.h:148
static const uint64_t kDpHiddenBit
Definition: dtoa.h:154
static const int kDpSignificandSize
Definition: dtoa.h:149
void rapidjson::internal::DiyFp::NormalizedBoundaries ( DiyFp minus,
DiyFp plus 
) const
inline

Definition at line 139 of file dtoa.h.

139  {
140  DiyFp pl = DiyFp((f << 1) + 1, e - 1).NormalizeBoundary();
141  DiyFp mi = (f == kDpHiddenBit) ? DiyFp((f << 2) - 1, e - 2) : DiyFp((f << 1) - 1, e - 1);
142  mi.f <<= mi.e - pl.e;
143  mi.e = pl.e;
144  *plus = pl;
145  *minus = mi;
146  }
static const uint64_t kDpHiddenBit
Definition: dtoa.h:154
DiyFp rapidjson::internal::DiyFp::operator* ( const DiyFp rhs) const
inline

mult_round

Definition at line 72 of file dtoa.h.

72  {
73 #if defined(_MSC_VER) && defined(_M_AMD64)
74  uint64_t h;
75  uint64_t l = _umul128(f, rhs.f, &h);
76  if (l & (uint64_t(1) << 63)) // rounding
77  h++;
78  return DiyFp(h, e + rhs.e + 64);
79 #elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__)
80  unsigned __int128 p = static_cast<unsigned __int128>(f) * static_cast<unsigned __int128>(rhs.f);
81  uint64_t h = static_cast<uint64_t>(p >> 64);
82  uint64_t l = static_cast<uint64_t>(p);
83  if (l & (uint64_t(1) << 63)) // rounding
84  h++;
85  return DiyFp(h, e + rhs.e + 64);
86 #else
87  const uint64_t M32 = 0xFFFFFFFF;
88  const uint64_t a = f >> 32;
89  const uint64_t b = f & M32;
90  const uint64_t c = rhs.f >> 32;
91  const uint64_t d = rhs.f & M32;
92  const uint64_t ac = a * c;
93  const uint64_t bc = b * c;
94  const uint64_t ad = a * d;
95  const uint64_t bd = b * d;
96  uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32);
97  tmp += 1U << 31; /// mult_round
98  return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), e + rhs.e + 64);
99 #endif
100  }
const double a
unsigned __int64 uint64_t
Definition: stdint.h:132
p
Definition: test.py:228
h
training ###############################
Definition: train_cnn.py:186
DiyFp rapidjson::internal::DiyFp::operator- ( const DiyFp rhs) const
inline

Definition at line 68 of file dtoa.h.

68  {
69  return DiyFp(f - rhs.f, e);
70  }

Member Data Documentation

int rapidjson::internal::DiyFp::e

Definition at line 157 of file dtoa.h.

uint64_t rapidjson::internal::DiyFp::f

Definition at line 156 of file dtoa.h.

const int rapidjson::internal::DiyFp::kDiySignificandSize = 64
static

Definition at line 148 of file dtoa.h.

const int rapidjson::internal::DiyFp::kDpExponentBias = 0x3FF + kDpSignificandSize
static

Definition at line 150 of file dtoa.h.

const uint64_t rapidjson::internal::DiyFp::kDpExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000)
static

Definition at line 152 of file dtoa.h.

const uint64_t rapidjson::internal::DiyFp::kDpHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000)
static

Definition at line 154 of file dtoa.h.

const int rapidjson::internal::DiyFp::kDpMinExponent = -kDpExponentBias
static

Definition at line 151 of file dtoa.h.

const uint64_t rapidjson::internal::DiyFp::kDpSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF)
static

Definition at line 153 of file dtoa.h.

const int rapidjson::internal::DiyFp::kDpSignificandSize = 52
static

Definition at line 149 of file dtoa.h.


The documentation for this struct was generated from the following file: