MCPcopy Create free account
hub / github.com/Open-GD/OpenGD / diyfp

Class diyfp

Source/external/json.hpp:16840–16956  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

16838}
16839
16840struct diyfp // f * 2^e
16841{
16842 static constexpr int kPrecision = 64; // = q
16843
16844 std::uint64_t f = 0;
16845 int e = 0;
16846
16847 constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {}
16848
16849 /*!
16850 @brief returns x - y
16851 @pre x.e == y.e and x.f >= y.f
16852 */
16853 static diyfp sub(const diyfp& x, const diyfp& y) noexcept
16854 {
16855 JSON_ASSERT(x.e == y.e);
16856 JSON_ASSERT(x.f >= y.f);
16857
16858 return {x.f - y.f, x.e};
16859 }
16860
16861 /*!
16862 @brief returns x * y
16863 @note The result is rounded. (Only the upper q bits are returned.)
16864 */
16865 static diyfp mul(const diyfp& x, const diyfp& y) noexcept
16866 {
16867 static_assert(kPrecision == 64, "internal error");
16868
16869 // Computes:
16870 // f = round((x.f * y.f) / 2^q)
16871 // e = x.e + y.e + q
16872
16873 // Emulate the 64-bit * 64-bit multiplication:
16874 //
16875 // p = u * v
16876 // = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi)
16877 // = (u_lo v_lo ) + 2^32 ((u_lo v_hi ) + (u_hi v_lo )) + 2^64 (u_hi v_hi )
16878 // = (p0 ) + 2^32 ((p1 ) + (p2 )) + 2^64 (p3 )
16879 // = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo + 2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3 )
16880 // = (p0_lo ) + 2^32 (p0_hi + p1_lo + p2_lo ) + 2^64 (p1_hi + p2_hi + p3)
16881 // = (p0_lo ) + 2^32 (Q ) + 2^64 (H )
16882 // = (p0_lo ) + 2^32 (Q_lo + 2^32 Q_hi ) + 2^64 (H )
16883 //
16884 // (Since Q might be larger than 2^32 - 1)
16885 //
16886 // = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H)
16887 //
16888 // (Q_hi + H does not overflow a 64-bit int)
16889 //
16890 // = p_lo + 2^64 p_hi
16891
16892 const std::uint64_t u_lo = x.f & 0xFFFFFFFFu;
16893 const std::uint64_t u_hi = x.f >> 32u;
16894 const std::uint64_t v_lo = y.f & 0xFFFFFFFFu;
16895 const std::uint64_t v_hi = y.f >> 32u;
16896
16897 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