diff --git a/include/rapidjson/internal/diyfp.h b/include/rapidjson/internal/diyfp.h index 320d05d..0b098af 100644 --- a/include/rapidjson/internal/diyfp.h +++ b/include/rapidjson/internal/diyfp.h @@ -238,7 +238,7 @@ inline DiyFp GetCachedPower(int e, int* K) { //int k = static_cast(ceil((-61 - e) * 0.30102999566398114)) + 374; double dk = (-61 - e) * 0.30102999566398114 + 347; // dk must be positive, so can do ceiling in positive int k = static_cast(dk); - if (k != dk) + if (dk - k > 0.0) k++; unsigned index = static_cast((k >> 3) + 1); diff --git a/include/rapidjson/internal/dtoa.h b/include/rapidjson/internal/dtoa.h index bf686b0..aec6bcd 100644 --- a/include/rapidjson/internal/dtoa.h +++ b/include/rapidjson/internal/dtoa.h @@ -193,8 +193,8 @@ inline char* Prettify(char* buffer, int length, int k) { } inline char* dtoa(double value, char* buffer) { - if (value == 0) { - Double d(value); + Double d(value); + if (d.IsZero()) { if (d.Sign()) *buffer++ = '-'; // -0.0, Issue #289 buffer[0] = '0'; diff --git a/include/rapidjson/internal/ieee754.h b/include/rapidjson/internal/ieee754.h index 934cf19..0b9393e 100644 --- a/include/rapidjson/internal/ieee754.h +++ b/include/rapidjson/internal/ieee754.h @@ -49,6 +49,7 @@ public: bool IsNan() const { return (u & kExponentMask) == kExponentMask && Significand() != 0; } bool IsInf() const { return (u & kExponentMask) == kExponentMask && Significand() == 0; } bool IsNormal() const { return (u & kExponentMask) != 0 || Significand() == 0; } + bool IsZero() const { return (u & (kExponentMask | kSignificandMask)) == 0; } uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); } int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; }