python - Raise to 1/3 gives complex number -
i cannot understand following output. expect numpy return -10 (or approximation). why complex number?
print((-1000)**(1/3.)) numpy answer
(5+8.660254037844384j) numpy official tutorial says answer nan. can find in middle of this tutorial.
you exponentiating regular python scalar rather numpy array.
try this:
import numpy np print(np.array(-1000) ** (1. / 3)) # nan the difference numpy not automatically promote result complex type, whereas python 3 scalar gets promoted complex value (in python 2.7 valueerror).
as explained in link @jonrsharpe gave above, negative numbers have multiple cube roots. root looking for, this:
x = -1000 print(np.copysign(np.abs(x) ** (1. / 3), x)) # -10.0 update 1
mark dickinson absolutely right underlying cause of problem - 1. / 3 not same third because of rounding error, x ** (1. / 3) not quite same thing cube root of x.
a better solution use scipy.special.cbrt, computes 'exact' cube root rather x ** (1./3):
from scipy.special import cbrt print(cbrt(-1000)) # -10.0 update 2
it's worth noting versions of numpy >= 0.10.0 have new np.cbrt function based on the c99 cbrt function.
Comments
Post a Comment