在repl.it和Windows中的控制台上使用Python 3.5,我得到了多维数据集根的错误答案。
当输入为(-1)**(1/3)
时,
我得到复数(0.5000000000000001 + 0.8660254037844386j)作为答案,它应该只是-1。此根下的任何负值似乎都会产生复杂的结果。
我做错了吗?
答案 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/3
,pi
不完全是同名的数学常数,三角函数也是精确数学函数的近似值。