How about:
def nth_root(val, n):
ret = int(val**(1./n))
return ret + 1 if (ret + 1) ** n == val else ret
print nth_root(124, 3)
print nth_root(125, 3)
print nth_root(126, 3)
print nth_root(1, 100)
Here, both val
and n
are expected to be integer and positive. This makes the return
expression rely exclusively on integer arithmetic, eliminating any possibility of rounding errors.
Note that accuracy is only guaranteed when val**(1./n)
is fairly small. Once the result of that expression deviates from the true answer by more than 1
, the method will no longer give the correct answer (it'll give the same approximate answer as your original version).
Still I am wondering why int(125**(1/3))
is 4
In [1]: '%.20f' % 125**(1./3)
Out[1]: '4.99999999999999911182'
int()
truncates that to 4
.