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

时间:2017-02-12 15:27:27

标签: python math

repl.it和Windows中的控制台上使用Python 3.5,我得到了多维数据集根的错误答案。

当输入为(-1)**(1/3)时, 我得到复数(0.5000000000000001 + 0.8660254037844386j)作为答案,它应该只是-1。此根下的任何负值似乎都会产生复杂的结果。

我做错了吗?

3 个答案:

答案 0 :(得分:1)

带负基数的指数通常涉及复数,因此Python在看到负数时会切换到复数。这种取幂通常是多重的,并且Python并不总是返回您可能期望的值。

对于具有真实基数的1/3功率的特殊情况,您可以编写如下函数:

 if let publishDateString = post["publishDate"] as? String {
                    print("publishDateString is \(publishDateString)") // 2/17/2016 2:49:00 PM
                    let myDateFormatter = DateFormatter()
                    myDateFormatter.dateFormat = "M/d/yyyy h:mm:ss a"
                    let dateFromString = myDateFormatter.date(from: publishDateString)!
                    print("My date from string is \(dateFromString)")  // 2016-02-17 19:49:00 +0000
                }

这将给出预期的真正立方根。

答案 1 :(得分:1)

实际上,Python并不知道你正在使用立方根!

所有它看到的是一个浮点参数,其值接近0.3333333333 ......但是由于表示的有限性,不可能猜到你的意思是1/3。

所以Python所能做的就是通过公式

回归通常的负基数取幂到真实幂(主分支)的定义
(-x)^y = exp(y(ln(x) + iπ) = exp(y ln(x)) (cos(yπ) + i sin(yπ))

产生复杂的值。

答案 2 :(得分:0)

你得到了这个答案,因为权力运算符计算

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