在Julia中将变量用作指数时遇到问题

在Julia中将变量用作指数时遇到问题,julia,exponent,Julia,Exponent,我对Julia是新来的,当时正在处理一些来自的示例问题,以此来掌握语言。来描述我面临的具体问题。我正试图为编程问题中的问题11编写一些代码,这需要我计算一个求和。我正在复制下面的代码。我将一个变量k设置为1,公式需要找到-1的值与k+1的幂。当k=1时,它应将结果计算为-1平方,该平方应为1,但返回-1。不确定这里出了什么问题。帮我理解我的错误 function computeequation() result = 0 for k = 1:1000000 resu

我对Julia是新来的,当时正在处理一些来自的示例问题,以此来掌握语言。来描述我面临的具体问题。我正试图为编程问题中的问题11编写一些代码,这需要我计算一个求和。我正在复制下面的代码。我将一个变量k设置为1,公式需要找到-1的值与k+1的幂。当k=1时,它应将结果计算为-1平方,该平方应为1,但返回-1。不确定这里出了什么问题。帮我理解我的错误

function computeequation()
    result = 0
    for k = 1:1000000
        result = result + ((-1^(k+1))/((2 * k) - 1))
    end
    return 4 * result
end

回答我自己的问题。看起来在-1周围添加大括号可以解决问题

function computeequation()
    result = 0
    for k = 1:1000000
        result = result + (((-1)^(k+1))/((2 * k) - 1))
    end
    return 4 * result
end

这是几种编程语言的共同点,不仅仅是Julia:求幂比减法或求反具有更高的优先级。对于Julia,您可以在此处看到运算符优先级的列表:

因此,
-1^2
无法产生您可能天真地期望的结果:

julia> -1^2
-1
要覆盖默认优先级,请根据需要使用括号:

julia> (-1)^2
1
正如Lyndon White在中所建议的,可视化表达式中操作优先级的一个好方法是引用它

julia> :(-1 ^ 2)
:(-(1 ^ 2))

julia> :((-1) ^ 2)
:((-1) ^ 2)
我很高兴看到全部内容:

这里您可以注意到,在第一种情况下,求幂是在求反之前完成的,在第二种情况下,使用括号时,求反是在求幂之前完成的

查看Julia中表达式如何降低的另一个简洁方法是使用函数:

julia> Meta.lower(Main, :(-1 ^ 2) )
:($(Expr(:thunk, CodeInfo(
    @ none within `top-level scope'
1 ─ %1 = Core.apply_type(Base.Val, 2)
│   %2 = (%1)()
│   %3 = Base.literal_pow(^, 1, %2)
│   %4 = -%3
└──      return %4
))))

julia> Meta.lower(Main, :((-1) ^ 2) )
:($(Expr(:thunk, CodeInfo(
    @ none within `top-level scope'
1 ─ %1 = Core.apply_type(Base.Val, 2)
│   %2 = (%1)()
│   %3 = Base.literal_pow(^, -1, %2)
└──      return %3
))))
对于您的特定问题,您可以这样做

function computeequation()
    result = 0
    for k = 1:1000_000
        result = result + ((-1) ^ (k + 1))/((2 * k) - 1)
    end
    return 4 * result
end

而不是使用
Meta.lower
我会引用它并转储AST,它将包含所有分组。你想把它加到你的答案里吗?
function computeequation()
    result = 0
    for k = 1:1000_000
        result = result + ((-1) ^ (k + 1))/((2 * k) - 1)
    end
    return 4 * result
end