Compute the (normalized) diyfp representing the input number 'value' and its boundaries.
15710{
15711 JSON_ASSERT(std::isfinite(value));
15712 JSON_ASSERT(value > 0);
15713
15714
15715
15716
15717
15718
15719 static_assert(std::numeric_limits<FloatType>::is_iec559,
15720 "internal error: dtoa_short requires an IEEE-754 floating-point implementation");
15721 constexpr int kPrecision = std::numeric_limits<FloatType>::digits;
15722 constexpr int kBias = std::numeric_limits<FloatType>::max_exponent - 1 + (kPrecision - 1);
15723 constexpr int kMinExp = 1 - kBias;
15724 constexpr std::uint64_t kHiddenBit = std::uint64_t{1} << (kPrecision - 1);
15725 using bits_type = typename std::conditional<kPrecision == 24, std::uint32_t, std::uint64_t >::type;
15726 const auto bits = static_cast<std::uint64_t>(reinterpret_bits<bits_type>(value));
15727 const std::uint64_t E = bits >> (kPrecision - 1);
15728 const std::uint64_t F = bits & (kHiddenBit - 1);
15729 const bool is_denormal = E == 0;
15730 const diyfp v = is_denormal
15731 ? diyfp(F, kMinExp)
15732 : diyfp(F + kHiddenBit, static_cast<int>(E) - kBias);
15733
15734
15735
15736
15737
15738
15739
15740
15741
15742
15743
15744
15745
15746
15747
15748
15749
15750
15751
15752
15753 const bool lower_boundary_is_closer = F == 0 && E > 1;
15754 const diyfp m_plus = diyfp(2 * v.f + 1, v.e - 1);
15755 const diyfp m_minus = lower_boundary_is_closer
15756 ? diyfp(4 * v.f - 1, v.e - 2)
15757 : diyfp(2 * v.f - 1, v.e - 1);
15758
15759 const diyfp w_plus = diyfp::normalize(m_plus);
15760
15761 const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e);
15762 return {diyfp::normalize(v), w_minus, w_plus};
15763}