Index: src/double.h |
diff --git a/src/double.h b/src/double.h |
index 54b83ecd5daf0c7371976d14340d3821945ab7c5..65eded99893c80e8b0f0493b9156bc579d2b15e6 100644 |
--- a/src/double.h |
+++ b/src/double.h |
@@ -54,18 +54,20 @@ class Double { |
explicit Double(DiyFp diy_fp) |
: d64_(DiyFpToUint64(diy_fp)) {} |
+ // The value encoded by this Double must be greater or equal to +0.0. |
+ // It must not be special (infinity, or NaN). |
DiyFp AsDiyFp() const { |
+ ASSERT(Sign() > 0); |
ASSERT(!IsSpecial()); |
return DiyFp(Significand(), Exponent()); |
} |
- // this->Significand() must not be 0. |
+ // The value encoded by this Double must be strictly greater than 0. |
DiyFp AsNormalizedDiyFp() const { |
+ ASSERT(value() > 0.0); |
uint64_t f = Significand(); |
int e = Exponent(); |
- ASSERT(f != 0); |
- |
// The current double could be a denormal. |
while ((f & kHiddenBit) == 0) { |
f <<= 1; |
@@ -82,6 +84,7 @@ class Double { |
return d64_; |
} |
+ // Returns the next greater double. Returns +infinity on input +infinity. |
double NextDouble() const { |
if (d64_ == kInfinity) return Double(kInfinity).value(); |
if (Sign() < 0 && Significand() == 0) { |
@@ -144,14 +147,19 @@ class Double { |
return (d64 & kSignMask) == 0? 1: -1; |
} |
+ // Precondition: the value encoded by this Double must be greater or equal |
+ // than +0.0. |
DiyFp UpperBoundary() const { |
+ ASSERT(Sign() > 0); |
return DiyFp(Significand() * 2 + 1, Exponent() - 1); |
} |
// Returns the two boundaries of this. |
// The bigger boundary (m_plus) is normalized. The lower boundary has the same |
// exponent as m_plus. |
+ // Precondition: the value encoded by this Double must be greater than 0. |
void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const { |
+ ASSERT(value() > 0.0); |
DiyFp v = this->AsDiyFp(); |
bool significand_is_zero = (v.f() == kHiddenBit); |
DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1)); |