mirror of
https://github.com/boostorg/charconv.git
synced 2026-02-02 20:52:14 +00:00
Improve rounding to 1 ULP
This commit is contained in:
@@ -87,21 +87,6 @@ struct IEEEl2bits
|
||||
#endif
|
||||
};
|
||||
|
||||
struct IEEEl2bits_oneman
|
||||
{
|
||||
#if BOOST_CHARCONV_ENDIAN_LITTLE_BYTE
|
||||
std::uint64_t mantissa : 64;
|
||||
std::uint32_t exponent : 15;
|
||||
std::uint32_t sign : 1;
|
||||
std::uint32_t pad : 32;
|
||||
#else // Big endian
|
||||
std::uint32_t pad : 32;
|
||||
std::uint32_t sign : 1;
|
||||
std::uint32_t exponent : 15;
|
||||
std::uint64_t mantissa : 64
|
||||
#endif
|
||||
};
|
||||
|
||||
struct ieee754_binary80
|
||||
{
|
||||
static constexpr int significand_bits = 63;
|
||||
|
||||
@@ -347,19 +347,11 @@ inline ResultType compute_float80(std::int64_t q, Unsigned_Integer w, bool negat
|
||||
return_val = negative ? -return_val : return_val;
|
||||
|
||||
// Do we need to round?
|
||||
IEEEl2bits_oneman bits;
|
||||
std::memcpy(&bits, &return_val, sizeof(return_val));
|
||||
if ((man & 1) != (bits.mantissa & 1))
|
||||
if (!(man & 1))
|
||||
{
|
||||
// Yes we should round
|
||||
if (bits.mantissa & 1)
|
||||
{
|
||||
++bits.mantissa;
|
||||
}
|
||||
else
|
||||
{
|
||||
--bits.mantissa;
|
||||
}
|
||||
IEEEl2bits bits;
|
||||
std::memcpy(&bits, &return_val, sizeof(return_val));
|
||||
++bits.mantissa_l;
|
||||
std::memcpy(&return_val, &bits, sizeof(return_val));
|
||||
}
|
||||
success = std::errc();
|
||||
|
||||
Reference in New Issue
Block a user