Rounding error

Frank Heckenbach f.heckenbach at fh-soft.de
Mon Sep 6 00:50:15 UTC 2021


Marco Bodrato wrote:

> Il 2021-08-25 05:54 Frank Heckenbach ha scritto:
> > mpf_get_str seems to round incorrectly sometimes.
> > In this test program, the digits around 809 are "...244594553...",
> > so it should round to "...244595", but it outputs "...244594".
> 
> Here, your report says that you expected a "rounded" result,
> but you get a truncated one.
> 
> Il 2021-08-27 07:36 Frank Heckenbach ha scritto:
> > Actually, what I wanted is truncation, not rounding. But AFAICS
> 
> Here, you say that you actually want truncation.

Yes, I actually want truncation.

Since GMP does not support string conversion with truncation
(correct?), I tried to emulate truncation by subtracting 0.5e-P,
then rounding, which should give the same result as truncation
(e.g. 2.3 -> 1.8, rounded to 2; 2.8 -> 2.3, rounded to 2).

When I did this, I found that in some cases, rounding was wrong, and
after asking here, I learned that apparently GMP is not expected to
always round correctly.

Yes, it's true that the wrong rounding happens to be truncation,
but that doesn't help me, since it only occurs sometimes, so I never
know if what I get is rounded or truncated.

My solution (hopefully) is therefore to multiply by 1eP, convert to
mpz_t and insert the decimal point manually.

AFAICS, the conversion to mpz_t always truncates (correct?), so this
should work (albeit slightly slower, but I don't mind).

If I ever need correct rounding with GMP (I don't ATM), I think
I could add 0.5e-P, then (like above) multiply by 1eP, convert to
mpz_t and insert the decimal point manually.

> > there is no string conversion function with truncation (correct?),
> 
>  From the manual I read a general claim about functions using mpf:
> "Final results are always truncated to the destination variable's 
> precision."
> See https://gmplib.org/manual-6.2.1/Floating_002dpoint-Functions .
> 
> Do you have an example of the function not working as documented?

AIUI, this refers to mpf_t computations (i.e. where the destination
is a mpf_t), not conversion to string, so something else. (String
conversions are usually rounded, but not always.)

Viele Grüße,
Frank


More information about the gmp-bugs mailing list