MCPcopy Create free account
hub / github.com/bytedance/Fastbot_Android / diyfp

Class diyfp

native/thirdpart/json/json.hpp:12699–12815  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

12697}
12698
12699struct diyfp // f * 2^e
12700{
12701 static constexpr int kPrecision = 64; // = q
12702
12703 std::uint64_t f = 0;
12704 int e = 0;
12705
12706 constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {}
12707
12708 /*!
12709 @brief returns x - y
12710 @pre x.e == y.e and x.f >= y.f
12711 */
12712 static diyfp sub(const diyfp& x, const diyfp& y) noexcept
12713 {
12714 assert(x.e == y.e);
12715 assert(x.f >= y.f);
12716
12717 return {x.f - y.f, x.e};
12718 }
12719
12720 /*!
12721 @brief returns x * y
12722 @note The result is rounded. (Only the upper q bits are returned.)
12723 */
12724 static diyfp mul(const diyfp& x, const diyfp& y) noexcept
12725 {
12726 static_assert(kPrecision == 64, "internal error");
12727
12728 // Computes:
12729 // f = round((x.f * y.f) / 2^q)
12730 // e = x.e + y.e + q
12731
12732 // Emulate the 64-bit * 64-bit multiplication:
12733 //
12734 // p = u * v
12735 // = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi)
12736 // = (u_lo v_lo ) + 2^32 ((u_lo v_hi ) + (u_hi v_lo )) + 2^64 (u_hi v_hi )
12737 // = (p0 ) + 2^32 ((p1 ) + (p2 )) + 2^64 (p3 )
12738 // = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo + 2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3 )
12739 // = (p0_lo ) + 2^32 (p0_hi + p1_lo + p2_lo ) + 2^64 (p1_hi + p2_hi + p3)
12740 // = (p0_lo ) + 2^32 (Q ) + 2^64 (H )
12741 // = (p0_lo ) + 2^32 (Q_lo + 2^32 Q_hi ) + 2^64 (H )
12742 //
12743 // (Since Q might be larger than 2^32 - 1)
12744 //
12745 // = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H)
12746 //
12747 // (Q_hi + H does not overflow a 64-bit int)
12748 //
12749 // = p_lo + 2^64 p_hi
12750
12751 const std::uint64_t u_lo = x.f & 0xFFFFFFFFu;
12752 const std::uint64_t u_hi = x.f >> 32u;
12753 const std::uint64_t v_lo = y.f & 0xFFFFFFFFu;
12754 const std::uint64_t v_hi = y.f >> 32u;
12755
12756 const std::uint64_t p0 = u_lo * v_lo;

Callers 1

compute_boundariesFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected