28#ifndef DOUBLE_CONVERSION_DOUBLE_H_
29#define DOUBLE_CONVERSION_DOUBLE_H_
56 explicit Double(uint64_t d64) : d64_(d64) {}
58 : d64_(DiyFpToUint64(diy_fp)) {}
92 if (d64_ == kInfinity)
return Double(kInfinity).value();
98 return Double(d64_ - 1).value();
100 return Double(d64_ + 1).value();
107 return Double(d64_ + 1).value();
110 return Double(d64_ - 1).value();
153#if (defined(__mips__) && !defined(__mips_nan2008)) || defined(__hppa__)
161#if (defined(__mips__) && !defined(__mips_nan2008)) || defined(__hppa__)
197 m_minus =
DiyFp((v.
f() << 2) - 1, v.
e() - 2);
199 m_minus =
DiyFp((v.
f() << 1) - 1, v.
e() - 1);
201 m_minus.
set_f(m_minus.
f() << (m_minus.
e() - m_plus.
e()));
202 m_minus.
set_e(m_plus.
e());
203 *out_m_plus = m_plus;
204 *out_m_minus = m_minus;
217 return physical_significand_is_zero && (
Exponent() != kDenormalExponent);
232 if (order <= kDenormalExponent)
return 0;
233 return order - kDenormalExponent;
237 return Double(kInfinity).value();
241 return Double(kNaN).value();
247#if (defined(__mips__) && !defined(__mips_nan2008)) || defined(__hppa__)
256 static uint64_t DiyFpToUint64(
DiyFp diy_fp) {
257 uint64_t significand = diy_fp.
f();
258 int exponent = diy_fp.
e();
266 if (exponent < kDenormalExponent) {
269 while (exponent > kDenormalExponent && (significand &
kHiddenBit) == 0) {
273 uint64_t biased_exponent;
274 if (exponent == kDenormalExponent && (significand &
kHiddenBit) == 0) {
277 biased_exponent =
static_cast<uint64_t
>(exponent +
kExponentBias);
298 explicit Single(uint32_t d32) : d32_(d32) {}
319 return biased_e - kExponentBias;
352#if (defined(__mips__) && !defined(__mips_nan2008)) || defined(__hppa__)
360#if (defined(__mips__) && !defined(__mips_nan2008)) || defined(__hppa__)
389 m_minus =
DiyFp((v.
f() << 2) - 1, v.
e() - 2);
391 m_minus =
DiyFp((v.
f() << 1) - 1, v.
e() - 1);
393 m_minus.
set_f(m_minus.
f() << (m_minus.
e() - m_plus.
e()));
394 m_minus.
set_e(m_plus.
e());
395 *out_m_plus = m_plus;
396 *out_m_minus = m_minus;
416 return physical_significand_is_zero && (
Exponent() != kDenormalExponent);
422 return Single(kInfinity).value();
426 return Single(kNaN).value();
431 static const int kDenormalExponent = -kExponentBias + 1;
432 static const int kMaxExponent = 0xFF - kExponentBias;
433 static const uint32_t kInfinity = 0x7F800000;
434#if (defined(__mips__) && !defined(__mips_nan2008)) || defined(__hppa__)
435 static const uint32_t kNaN = 0x7FBFFFFF;
437 static const uint32_t kNaN = 0x7FC00000;
void set_f(uint64_t new_value)
Definition diy-fp.h:125
uint64_t f() const
Definition diy-fp.h:122
static const int kSignificandSize
Definition diy-fp.h:43
void Normalize()
Definition diy-fp.h:96
void set_e(int32_t new_value)
Definition diy-fp.h:126
int32_t e() const
Definition diy-fp.h:123
Double(double d)
Definition ieee.h:55
Double(DiyFp diy_fp)
Definition ieee.h:57
static const int kSignificandSize
Definition ieee.h:50
void NormalizedBoundaries(DiyFp *out_m_minus, DiyFp *out_m_plus) const
Definition ieee.h:191
double NextDouble() const
Definition ieee.h:91
double value() const
Definition ieee.h:220
int Exponent() const
Definition ieee.h:114
bool LowerBoundaryIsCloser() const
Definition ieee.h:207
bool IsSignalingNan() const
Definition ieee.h:160
static double Infinity()
Definition ieee.h:236
static const int kPhysicalSignificandSize
Definition ieee.h:49
double PreviousDouble() const
Definition ieee.h:104
Double()
Definition ieee.h:54
bool IsInfinite() const
Definition ieee.h:169
bool IsSpecial() const
Definition ieee.h:141
static double NaN()
Definition ieee.h:240
static const int kMaxExponent
Definition ieee.h:52
static const int kExponentBias
Definition ieee.h:51
static const uint64_t kSignMask
Definition ieee.h:44
DiyFp UpperBoundary() const
Definition ieee.h:182
uint64_t Significand() const
Definition ieee.h:123
int Sign() const
Definition ieee.h:175
uint64_t AsUint64() const
Definition ieee.h:86
static const uint64_t kHiddenBit
Definition ieee.h:47
bool IsNan() const
Definition ieee.h:146
static const uint64_t kQuietNanBit
Definition ieee.h:48
bool IsQuietNan() const
Definition ieee.h:152
static const uint64_t kSignificandMask
Definition ieee.h:46
static int SignificandSizeForOrderOfMagnitude(int order)
Definition ieee.h:228
Double(uint64_t d64)
Definition ieee.h:56
DiyFp AsNormalizedDiyFp() const
Definition ieee.h:69
bool IsDenormal() const
Definition ieee.h:134
DiyFp AsDiyFp() const
Definition ieee.h:62
static const uint64_t kExponentMask
Definition ieee.h:45
static float Infinity()
Definition ieee.h:421
DiyFp AsDiyFp() const
Definition ieee.h:302
Single()
Definition ieee.h:296
int Exponent() const
Definition ieee.h:313
static const uint32_t kSignificandMask
Definition ieee.h:290
bool LowerBoundaryIsCloser() const
Definition ieee.h:406
static const uint32_t kQuietNanBit
Definition ieee.h:292
static const int kSignificandSize
Definition ieee.h:294
DiyFp UpperBoundary() const
Definition ieee.h:401
static const uint32_t kHiddenBit
Definition ieee.h:291
uint32_t AsUint32() const
Definition ieee.h:309
bool IsDenormal() const
Definition ieee.h:333
static const int kPhysicalSignificandSize
Definition ieee.h:293
float value() const
Definition ieee.h:419
void NormalizedBoundaries(DiyFp *out_m_minus, DiyFp *out_m_plus) const
Definition ieee.h:383
bool IsSignalingNan() const
Definition ieee.h:359
bool IsNan() const
Definition ieee.h:345
static float NaN()
Definition ieee.h:425
Single(float f)
Definition ieee.h:297
uint32_t Significand() const
Definition ieee.h:322
static const uint32_t kSignMask
Definition ieee.h:288
bool IsQuietNan() const
Definition ieee.h:351
bool IsSpecial() const
Definition ieee.h:340
bool IsInfinite() const
Definition ieee.h:368
static const uint32_t kExponentMask
Definition ieee.h:289
int Sign() const
Definition ieee.h:374
Single(uint32_t d32)
Definition ieee.h:298
Dest BitCast(const Source &source)
Definition utils.h:395
static float uint32_to_float(uint32_t d32)
Definition ieee.h:39
static uint64_t double_to_uint64(double d)
Definition ieee.h:36
static double uint64_to_double(uint64_t d64)
Definition ieee.h:37
static uint32_t float_to_uint32(float f)
Definition ieee.h:38
#define DOUBLE_CONVERSION_ASSERT(condition)
Definition utils.h:46
#define DOUBLE_CONVERSION_UINT64_2PART_C(a, b)
Definition utils.h:195
#define DOUBLE_CONVERSION_DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition utils.h:216