Re: Rounding error

2021-09-08 Thread Torbjörn Granlund
Paul Zimmermann  writes:

  Of course you can add say 100 guard bits, then the probability to get an
  incorrect rounding is about 2^-100...

You're joking, but this was sort-of my thinking when designing mpf!

-- 
Torbjörn
Please encrypt, key id 0xC8601622
___
gmp-bugs mailing list
gmp-bugs@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-bugs


Re: Rounding error

2021-09-08 Thread Paul Zimmermann
   Dear Frank,

> 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.

since there is no documented error bound in the mpf computations,
there is no chance that this will (provably) work. The GMP manual says:

  Note that the 'mpf' functions are _not_ intended as a smooth
   extension to IEEE P754 arithmetic.  In particular results obtained on
   one computer often differ from the results on a computer with a
   different word size.

Of course you can add say 100 guard bits, then the probability to get an
incorrect rounding is about 2^-100...

Best regards,
Paul Zimmermann
___
gmp-bugs mailing list
gmp-bugs@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-bugs


Re: Rounding error

2021-09-06 Thread Frank Heckenbach
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
___
gmp-bugs mailing list
gmp-bugs@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-bugs


Re: Rounding error

2021-08-27 Thread Marco Bodrato

Ciao,

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.


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?

Ĝis,
m
___
gmp-bugs mailing list
gmp-bugs@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-bugs


Re: Rounding error

2021-08-27 Thread Frank Heckenbach
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;
}
___
gmp-bugs mailing list
gmp-bugs@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-bugs


Re: Rounding error

2021-08-25 Thread Marc Glisse

On Wed, 25 Aug 2021, Frank Heckenbach wrote:


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".


Hello,

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


--
Marc Glisse
___
gmp-bugs mailing list
gmp-bugs@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-bugs