在数学中,允许取负数的三次方根,因为负数乘以其他两个负数会得到负数。把一个分数提高到1,等于取n的平方根。因此,-27或(-27)**(1.0/3.0)的三次方根是-3。但是在Python 2中,当我输入(- 27)**(1/3)时,它给了我一个错误:Traceback (most recent call last): File "python", line 1, in <module>ValueError: negative number cannot be raised to a fractional powerPython 3不会产生异常,但它给出了一个复杂的数字,它看起来不像任何东西——3:>>> (-27)**(1.0/3.0)(1.5000000000000004+2.598076211353316j)为什么我得不到有数学意义的结果呢?有办法解决这个问题吗? 最佳答案 -27有一个实立方根(和两个非实立方根),但(-27)**(1.0/3.0)并不意味着“取-27的实立方根”。首先,由于浮点表示法的限制,cc不能精确地计算到三分之一。它精确地评估0.333333333333333314829616256247390992939472198486328125尽管默认情况下,python不会打印确切的值。其次,1.0/3.0不是一个查找根的操作,不管是实根还是主根还是其他选择。它是指数运算。对任意实数幂的负数的一般幂指数是杂乱的,并且通常的定义与实数n根不匹配;例如,(- 27)^(1/3)的通常定义将给你主根、复数、非-3。Python 2决定,除非你明确说明你的意图,否则最好对这样的东西提出一个错误,例如,取消绝对值,然后应用这个符号:def real_nth_root(x, n): # approximate # if n is even, x must be non-negative, and we'll pick the non-negative root. if n % 2 == 0 and x < 0: raise ValueError("No real root.") return (abs(x) ** (1.0/n)) * (-1 if x < 0 else 1)或者使用complex**和exp作为主根:import cmathdef principal_nth_root(x, n): # still approximate return cmath.exp(cmath.log(x)/n)或者只需将其转换为复数幂(相当于EXP日志到舍入误差):>>> complex(-27)**(1.0/3.0)(1.5000000000000004+2.598076211353316j)Python 3使用负数的复数幂为非整数,它给出了log的主体第一根:>>> (-27)**(1/3) # Python 3(1.5000000000000004+2.598076211353316j)关于python - 为什么在Python中(-27)**(1.0/3.0)不是-3.0?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46225028/
10-12 21:44