1/2等于0.5,但sqrt(-1)会产生域错误。

3
这是关于Julia设计的一个问题。在Julia中,1/2返回0.5,通常整数除法返回一个浮点数,所以4/22.0。这似乎很合理。
我想知道为什么同样的推理没有应用于sqrt。也就是说,对我来说,一致性要求sqrt始终返回一个Complex,特别是sqrt(-1)应该返回im(或者-im,但这是另一个讨论)。然而,sqrt(-1)会返回DomainError
或者至少应该有一个版本的sqrt返回复数根(就像除法一样,你有div/)。
因此,有两个问题:
  1. 这种设计决策(不一致的处理/sqrt)背后的原因是什么?
  2. 是否有一个版本的sqrt可以返回复数平方根?

我希望 Julia 语言的其中一位设计者能够过来回答你的第一个问题。 - Sean Bright
http://docs.julialang.org/en/release-0.4/manual/faq/#why-does-julia-give-a-domainerror-for-certain-seemingly-sensible-operations - StefanKarpinski
如果 sqrt 总是返回 Complex,它也将是类型稳定的。 - a06e
7
没错,但是对于常见的要求对非负浮点数进行平方根运算的情况来说,性能将非常糟糕。 - StefanKarpinski
@StefanKarpinski 我明白了。谢谢。 - a06e
2个回答

8
你应该阅读文档 :)
sqrt(-1)

错误:DomainError:sqrt只有在使用复合数参数调用时才会返回复合结果。尝试sqrt(complex(x))。 在math.jl的sqrt处:146

所以您实际上需要的是,既然im被定义为sqrt(-1),而您需要sqrt(-1),您可以这样做...

 sqrt(complex(im^2))

或者只是:
sqrt(complex(-1))

好的,抱歉我错过了那个。我的第一个问题很琐碎 :D - a06e

1
实际上,这在复数的文档中有说明:
julia> sqrt(-1)
ERROR: DomainError:
sqrt will only return a complex result if called with a complex argument. Try sqrt(complex(x)).
in sqrt at math.jl:146

julia> sqrt(-1 + 0im)
0.0 + 1.0im

或者,另一种选择是:
julia> sqrt(complex(-1))
0.0 + 1.0im

简而言之,为了得到负数的sqrt的正确答案,它必须是复数类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接