Karim Belabas on Thu, 11 Jan 2018 10:16:45 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: sqrtnint algorithm improvement for huge arguments (plus memory leak issue)


* Jérôme Raulin [2018-01-11 08:29]:
> Hi Karim and thanks for your prompt answer.
> 
> Indeed performance improvement is impressive, my solution to latest project
> Euler problem got a 10x performance increase.
> Still there must be a side effect in your fix since sqrtnint givers wrong
> answer in some specific cases :
>   Latest development version including your fix :
>   gp > sqrtnint(10^500,27)
>   %1 = 3300034791125284633
>   Previous version :
>   gp > sqrtnint(10^500,27)
>   %1 = 3300034791125284639
> The second being the correct answer.
> Other cases are : (10^200, 11), (10^300, 8), (10^400, 11), (10^400, 22)
> In some cases the error is very small but for example for sqrtnint(10^300,
> 8) the error is huge :
>   gp > sqrtnint(10^300,8)
>   %1 = 31622776601683793296491743452850028544
>   Previous version :
>   gp > sqrtnint(10^300,8)
>   %1 = 31622776601683793319988935444327185337
> 
> I add a look at the new code and it may be due to the fact that the bailout
> criteria makes the hypothesis that the original approximation is always
> greater or equal than the result and that now ceil(exp(log(a)/n)) can
> sometimes give approximation lower than result. Still you seems to take care
> of this case while copying x to xs.

Or so I thought. Indeed, there is no guarantee that exp(log(a)/n) is
correct to 1 ulp: atomic operations are, not their composition, and the
difference is bounded by log(2^BIT_INLONG) ~ 44.36 in our case. So my + 1
was definitely not enough.

I just increased the accuracy for this initial floating point computation
to 128 bits if the result is > 2^32, before truncating to the requested
64 bits rounding up, and the above problems disappear.

Thanks for checking the patch !

Cheers,

    K.B.
--
Karim Belabas, IMB (UMR 5251)  Tel: (+33) (0)5 40 00 26 17
Universite de Bordeaux         Fax: (+33) (0)5 40 00 21 23
351, cours de la Liberation    http://www.math.u-bordeaux.fr/~kbelabas/
F-33405 Talence (France)       http://pari.math.u-bordeaux.fr/  [PARI/GP]
`