繁体   English   中英

Python中多维数据集根的错误值

[英]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/3pi不完全是同名的数学常数,三角函数也是精确数学函数的近似值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM