Jérôme Raulin on Thu, 11 Jan 2018 12:55:39 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
RE: sqrtnint algorithm improvement for huge arguments (plus memory leak issue) |
Thanks a lot Karim, it seems to work correctly now and the performance are excellent (in the 10^10000 range I got a 40x improvement on my script). Cheers. Jerome -----Message d'origine----- De : Karim Belabas [mailto:Karim.Belabas@math.u-bordeaux.fr] Envoyé : jeudi 11 janvier 2018 10:17 À : pari-dev@pari.math.u-bordeaux.fr Objet : 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] `