Lines Matching defs:diyfp
57 struct diyfp // f * 2^e
64 constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {}
70 static diyfp sub(const diyfp& x, const diyfp& y) noexcept
82 static diyfp mul(const diyfp& x, const diyfp& y) noexcept
147 static diyfp normalize(diyfp x) noexcept
164 static diyfp normalize_to(const diyfp& x, const int target_exponent) noexcept
177 diyfp w;
178 diyfp minus;
179 diyfp plus;
183 Compute the (normalized) diyfp representing the input number 'value' and its
194 // Convert the IEEE representation into a diyfp.
216 const diyfp v = is_denormal
217 ? diyfp(F, kMinExp)
218 : diyfp(F + kHiddenBit, static_cast<int>(E) - kBias);
242 const diyfp m_plus = diyfp(2 * v.f + 1, v.e - 1);
243 const diyfp m_minus = lower_boundary_is_closer
244 ? diyfp(4 * v.f - 1, v.e - 2) // (B)
245 : diyfp(2 * v.f - 1, v.e - 1); // (A)
248 const diyfp w_plus = diyfp::normalize(m_plus);
251 const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e);
253 return {diyfp::normalize(v), w_minus, w_plus};
256 // Given normalized diyfp w, Grisu needs to find a (normalized) cached
322 For a normalized diyfp w = f * 2^e, this function returns a (normalized) cached
351 // normalized diyfp's w = f * 2^e, with q = 64,
356 // -11 (normalize the diyfp)
363 // -11 (normalize the diyfp)
588 diyfp M_minus, diyfp w, diyfp M_plus)
594 // number V = buffer * 10^decimal_exponent in the range [M-, M+]. The diyfp's
608 std::uint64_t delta = diyfp::sub(M_plus, M_minus).f; // (significand of (M+ - M-), implicit exponent is e)
609 std::uint64_t dist = diyfp::sub(M_plus, w ).f; // (significand of (M+ - w ), implicit exponent is e)
618 const diyfp one(std::uint64_t{1} << -M_plus.e, M_plus.e);
694 // The rounding procedure works with diyfp's with an implicit
829 diyfp m_minus, diyfp v, diyfp m_plus)
845 const diyfp c_minus_k(cached.f, cached.e); // = c ~= 10^-k
848 const diyfp w = diyfp::mul(v, c_minus_k);
849 const diyfp w_minus = diyfp::mul(m_minus, c_minus_k);
850 const diyfp w_plus = diyfp::mul(m_plus, c_minus_k);
856 // diyfp::mul rounds its result and c_minus_k is approximated too. w, w- and
873 const diyfp M_minus(w_minus.f + 1, w_minus.e);
874 const diyfp M_plus (w_plus.f - 1, w_plus.e );
890 static_assert(diyfp::kPrecision >= std::numeric_limits<FloatType>::digits + 3,