2 ^( - 1/3)的答案是三个根:
0.79370,-0.39685-0.68736i和0.39685 + 0.68736i(约)
请参阅Wolfram Alpha的正确答案.
我知道有几种支持复数的语言,但它们只返回三个结果中的第一个:
蟒蛇:
>>> complex(2,0)**(-1/3) (0.7937005259840998-0j)
八度:
>> (2+0i)^(-1/3) ans = 0.79370
朱莉娅:
julia> complex(2,0)^(-1/3) 0.7937005259840998 + 0.0im
我正在寻找的东西是:
>> 2^(-1/3) [0.79370+0i, -0.39685-0.68736i, 0.39685+0.68736i]
是否有一种编程语言(带有REPL)可以正确地返回所有三个根,而不必求助于任何特殊的模块或库,它们也有可用的开源实现?
正如许多评论所解释的那样,想要一个通用语言默认情况下,复杂根函数的每个分支的结果可能是一个很高的顺序.但是Julia允许非常自然地专门化/重载运算符(因为即使是开箱即用的实现也经常用Julia编写).特别:
using Roots,Polynomials # Might need to Pkg.add("Roots") first import Base: ^ ^{T<:AbstractFloat}(b::T, r::Rational{Int64}) = roots(poly([0])^r.den - b^abs(r.num)).^sign(r.num)
现在,当试图将浮动提升到合理的力量时:
julia> 2.0^(-1//3) 3-element Array{Complex{Float64},1}: -0.39685-0.687365im -0.39685+0.687365im 0.793701-0.0im
请注意,专门定义^
理性指数可以解决注释中提到的舍入问题.