[英]Wrong value for cube root in Python
在repl.it和Windows中的控制台上使用Python 3.5,我得到了立方根的错误答案。
当输入为(-1)**(1/3)
,我得到复数(0.5000000000000001 + 0.8660254037844386j)作为答案,它应该只是-1。 此根下的任何负值似乎都会产生复杂的结果。
难道我做错了什么?
带负数的指数通常涉及复数,因此Python在看到负数时会切换到复数。 这种取幂通常是多重的,并且Python并不总是返回您可能期望的值。
对于具有真实基数的1/3功率的特殊情况,您可以编写如下函数:
def cubeRoot(x):
if x >= 0:
return x**(1/3)
else:
return -(-x)**(1/3)
这将给出预期的真实立方根。
实际上,Python并不知道你正在使用立方根!
所有它看到的是一个浮点参数,其值接近0.3333333333 ......但由于表示的有限性,不可能猜到你的意思正好是1/3。
所以Python所能做的就是通过公式回归通常的负基数取幂到真实幂(主分支)的定义
(-x)^y = exp(y(ln(x) + iπ) = exp(y ln(x)) (cos(yπ) + i sin(yπ))
这产生了复杂的价值。
你得到了这个答案,因为电力操作员计算
x**y = exp(y*ln(x))
如果x
不是正实数,那么它的对数是从复数对数的主分支计算出来的
ln(u+i*v)=0.5*ln(u²+v²) + i*arg(u+i*v)
数学库中的术语arg(u+i*v)=atan2(v,u)
。
因此ln(-1)=i*pi
和
(-1)**(1.0/3)=exp(i*pi/3)=cos(pi/3)+i*sin(pi/3)
它具有你所拥有的价值。 浮点误差发生,因为y=1.0/3
不完全是1/3
y=1.0/3
, pi
不完全是同名的数学常数,三角函数也是精确数学函数的近似值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.