Rounding error

Frank Heckenbach f.heckenbach at fh-soft.de
Fri Aug 27 05:36:49 UTC 2021


Marc Glisse wrote:

> if you care about correct rounding, I would recommend you use MPFR 
> instead.

This seems to be a bigger change which I'd like to avoid, at least
for now. (I use GMP in several programs, some of which have grown
over many years ...)

Actually, what I wanted is truncation, not rounding. But AFAICS
there is no string conversion function with truncation (correct?),
so I tried subtracting 0.5e-P, then rounding, which ran into this
problem.

So now I try multiplying by 1eP and converting to mpz which does
truncation. (It seems slightly slower, but insignificant to me.)

This doesn't seem to have precision issues (and if needed, it seems
correct rounding can be done by adding 0.5e-P and truncating like
this). At least my tests give correct results. Is this expected or
was I just lucky?

This is the function I use (C++ with an obvious implementation of
ToString; decimal only):

std::string mpf_to_string (mpf_class x, size_t precision)
{
  auto r = ToString ((x < 0 ? "-" : ""), std::setw (precision + 1), std::setfill ('0'), mpz_class (abs (x * mpf_class (ToString ("1e", precision)))));
  r.insert (r.length () - precision, ".");
  return r;
}


More information about the gmp-bugs mailing list