66 #ifndef ApproxMVBB_Common_FloatingPointComparision_hpp 67 #define ApproxMVBB_Common_FloatingPointComparision_hpp 69 template <
size_t size>
95 typedef unsigned __int64
UInt;
97 typedef long long Int;
98 typedef unsigned long long UInt;
99 #endif // GTEST_OS_WINDOWS 104 template <
typename RawType>
114 static const size_t kBitCount = 8*
sizeof(RawType);
117 static const size_t kFractionBitCount =
118 std::numeric_limits<RawType>::digits - 1;
121 static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
124 static const Bits kSignBitMask =
static_cast<Bits
>(1) << (kBitCount - 1);
127 static const Bits kFractionBitMask =
128 ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
131 static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
145 static const size_t kMaxUlps = 4;
168 return ReinterpretBits(kExponentBitMask);
172 static RawType Max();
177 const Bits &
bits()
const {
return u_.bits_; }
186 Bits
sign_bit()
const {
return kSignBitMask & u_.bits_; }
192 return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
204 if (is_nan() || rhs.
is_nan())
return false;
206 return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.
u_.
bits_)
233 if (kSignBitMask & sam) {
238 return kSignBitMask | sam;
246 const Bits biased1 = SignAndMagnitudeToBiased(sam1);
247 const Bits biased2 = SignAndMagnitudeToBiased(sam2);
248 return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
static Bits SignAndMagnitudeToBiased(const Bits &sam)
static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1, const Bits &sam2)
Bits exponent_bits() const
static RawType ReinterpretBits(const Bits bits)
bool AlmostEquals(const FloatingPoint &rhs) const
Bits fraction_bits() const
TypeWithSize< sizeof(RawType)>::UInt Bits
const Bits & bits() const
FloatingPoint(const RawType &x)
static RawType Infinity()