Raise to 1/3 gives complex number

后端 未结 1 585
终归单人心
终归单人心 2020-12-11 15:43

I cannot understand the following output. I would expect Numpy to return -10 (or an approximation). Why is it a complex number?

print((-1000)**(         


        
相关标签:
1条回答
  • 2020-12-11 16:09

    You are exponentiating a regular Python scalar rather than a numpy array.

    Try this:

    import numpy as np
    
    print(np.array(-1000) ** (1. / 3))
    # nan
    

    The difference is that numpy does not automatically promote the result to a complex type, whereas a Python 3 scalar gets promoted to a complex value (in Python 2.7 you would just get a ValueError).

    As explained in the link @jonrsharpe gave above, negative numbers have multiple cube roots. To get the root you are looking for, you could do something like this:

    x = -1000
    print(np.copysign(np.abs(x) ** (1. / 3), x))
    # -10.0
    

    Update 1

    Mark Dickinson is absolutely right about the underlying cause of the problem - 1. / 3 is not exactly the same as a third because of rounding error, so x ** (1. / 3) is not quite the same thing as the cube root of x.

    A better solution would be to use scipy.special.cbrt, which computes the 'exact' cube root rather than x ** (1./3):

    from scipy.special import cbrt
    
    print(cbrt(-1000))
    # -10.0
    

    Update 2

    It's also worth noting that versions of numpy >= 0.10.0 will have a new np.cbrt function based on the C99 cbrt function.

    0 讨论(0)
提交回复
热议问题