【问题标题】:julia provide wrong numerical result朱莉娅提供了错误的数字结果
【发布时间】:2018-09-08 13:05:09
【问题描述】:

当我试图计算时

julia> -2.3^-7.6
-0.0017818389423254909

但是我的计算器给出的结果是

0.0005506 + 0.001694 i

为了安全起见,我又试了一次,但这次它抱怨了。为什么我第一次尝试时它没有抱怨?

julia> a = -2.3; b = -7.6; a^b
ERROR: DomainError with -2.6:
Exponentiation yielding a complex result requires a complex argument.
Replace x^y with (x+0im)^y, Complex(x)^y, or similar.
Stacktrace:
 [1] throw_exp_domainerror(::Float64) at ./math.jl:35
 [2] ^(::Float64, ::Float64) at ./math.jl:769
 [3] top-level scope at none:0
 [4] eval at ./boot.jl:319 [inlined]
 [5] #85 at /Users/ssiew/.julia/packages/Atom/jodeb/src/repl.jl:129 [inlined]
 [6] with_logstate(::getfield(Main, Symbol("##85#87")),::Base.CoreLogging.LogState) at ./logging.jl:397
 [7] with_logger(::Function, ::Atom.Progress.JunoProgressLogger) at ./logging.jl:493
 [8] top-level scope at /Users/ssiew/.julia/packages/Atom/jodeb/src/repl.jl:128

【问题讨论】:

  • 顺便说一句。 -2.3**-7.6 的 python 的结果是相同的 (-0.0017818389423254909) ...
  • 在python中尝试(-2.3)**(-7.6)
  • 我明白你的意思! :) 你可能会create issue。但是您也可以尝试import Base.^;function Base.:^(x::Float64, y::Float64) z = ccall("llvm.pow.f64", llvmcall, Float64, (Float64, Float64), x, y); if isnan(z) & !isnan(x+y) return Complex(x)^y; end; z; end,然后(-2.3) ^ -7.6 可能会像您期望的那样工作:P

标签: math julia operator-precedence


【解决方案1】:

这是一个操作顺序问题。你可以看到 Julia 是如何解析这个表达式的:

julia> parse("-2.3^-7.6")
:(-(2.3 ^ -7.6))

所以你没有任何问题的原因是因为你实际上取了 2.3 ^ (-7.6),即 0.0017818389423254909,然后翻转符号。

您的第二种方法相当于确保“x^y”中的“x”确实是负数,或者:

julia> parse("(-2.3)^-7.6")
:(-2.3 ^ -7.6)

julia> eval(parse("(-2.3)^-7.6"))
ERROR: DomainError:
Exponentiation yielding a complex result requires a complex argument.
Replace x^y with (x+0im)^y, Complex(x)^y, or similar.
Stacktrace:
 [1] nan_dom_err at ./math.jl:300 [inlined]
 [2] ^(::Float64, ::Float64) at ./math.jl:699
 [3] eval(::Module, ::Any) at ./boot.jl:235
 [4] eval(::Any) at ./boot.jl:234

如果我们遵循该说明,我们会得到您所期望的:

julia> Complex(-2.3)^-7.6
0.0005506185144176565 + 0.0016946295370871215im

【讨论】:

  • 为什么计算器和Julia的运算顺序不同?数学中是否存在“标准”顺序?
  • Meta.parse("-2.3^-7.6") 用于 Julia 1.x
  • 我用的是RPL计算器HP-48SX
猜你喜欢
  • 1970-01-01
  • 2018-11-27
  • 2014-04-26
  • 1970-01-01
  • 2016-05-09
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多