Denis Simon on Mon, 18 Jul 2016 10:46:03 +0200

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

Re: Re[2]: floor(121^(1/2))=10(??)

For the previous perfect square, you can use sqrtint(). For example :
gp > sqrtint(122)
> %1 = 11

For the previous perfect n-power, use sqrtnint(). For example:
gp > sqrtint(3,122)
> %2 = 4

With these functions, you don't have to care about the precision.

Denis SIMON.

De: "Zak Seidov" <>
À: "Karim Belabas" <>
Envoyé: Dimanche 17 Juillet 2016 13:03:18
Objet: Re[2]: floor(121^(1/2))=10(??)

OK, I understand, that sometimes floor is wrong.
But plz  help to write a code for computing perfect power number
next to given n (which itself is ppn).
Checking each number n+1,n+2,..etc is too slow code
(for very large n's)..

Воскресенье, 17 июля 2016, 13:14 +03:00 от Karim Belabas <>:

* Zak Seidov [2016-07-17 10:02]:
> (10:59) gp > floor(121^(1/2))
> %1 = 10

This is expected.

* 121^(1/2) is replaced by a floating point approximation. This is
  accurate to 1 ulp of relative accuracy so any element of [10.9999...9,
  11.000...1] is an acceptable result. (This is a white lie: internally,
  we work in base 2, not 10.)

* the (non-continuous) floor() function is applied to that approximation.
  Depending on the accuracy and the multiprecision kernel you may get
  either of 10 or 11.

floor() and ceil() are quite unreliable with floating point quantities;
round() is OK provided the result is known to be an integer, and
approximated to sufficient accuracy.

If you want a reliable algebraic test, use
  issquare(121, &t);
or more generally, ispower(). Then t is guaranteed to be the expected


Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17
Universite de Bordeaux Fax: (+33) (0)5 40 00 69 50
351, cours de la Liberation
F-33405 Talence (France) [PARI/GP]