Improve rounding to 1 ULP

This commit is contained in:
Matt Borland
2023-07-06 15:07:45 +02:00
parent 31fa9edadd
commit 1a4671024d
2 changed files with 4 additions and 27 deletions

View File

@@ -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;

View File

@@ -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();