Swift中的指数运算符

mcg*_*086 71 exponentiation swift

我没有看到Swift语言参考中的基本算术运算符中定义了一个取幂运算符.

语言中是否真的没有预定义的整数或浮点运算运算符?

Con*_*nor 86

没有操作员,但您可以使用这样的pow功能:

return pow(num, power)
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你也可以让操作员调用pow函数,如下所示:

infix operator ** { associativity left precedence 170 }

func ** (num: Double, power: Double) -> Double{
    return pow(num, power)
}

2.0**2.0 //4.0
Run Code Online (Sandbox Code Playgroud)

  • 警告!这里有一个问题.例如,通常在编程语言中,`-2.0**2.0 = - (2.0**2.0)= -4.0`.但是,这里是`-2.0**2.0 =( - 2.0)**2.0 = 4.0`,这可能不是预期的用途,可能会导致非常讨厌且难以追踪的错误. (19认同)
  • 指数是不是正确的联想?https://en.wikipedia.org/wiki/Operator_associativity (7认同)
  • ^运算符在Swift中定义为XOR. (3认同)

小智 23

如果您恰好将2提升到某个功率,则可以使用按位左移运算符:

let x = 2 << 0    // 2
let y = 2 << 1    // 4
let z = 2 << 7    // 256
Run Code Online (Sandbox Code Playgroud)

请注意,"功率"值比您想象的要小1.

请注意,这比pow(2.0, 8.0)使用速度更快,并且可以避免使用双打.

  • 我对二的幂感兴趣,所以它为我解答了。 (3认同)
  • 就目前而言,这很好,但是并不能真正回答问题。 (2认同)

rei*_*kus 12

对于任何寻找Swix 3版本的中**缀运算符的人:

precedencegroup ExponentiationPrecedence {
  associativity: right
  higherThan: MultiplicationPrecedence
}

infix operator ** : ExponentiationPrecedence

func ** (_ base: Double, _ exp: Double) -> Double {
  return pow(base, exp)
}

func ** (_ base: Float, _ exp: Float) -> Float {
  return pow(base, exp)
}

2.0 ** 3.0 ** 2.0    // 512
(2.0 ** 3.0) ** 2.0  // 64
Run Code Online (Sandbox Code Playgroud)

  • 尼斯.别忘了"输入达尔文"来获得"战俘" (5认同)
  • 很确定应该留下关联性,而不是正确的.2 ^ 3 ^ 2是64,而不是512. (3认同)

lda*_*lek 5

我是这样做的:

operator infix ** { associativity left precedence 200 }

func ** (base: Double, power: Double) -> Double {
    return exp(log(base) * power)
}
Run Code Online (Sandbox Code Playgroud)


tym*_*mac 5

斯威夫特 4.2

import Foundation

var n = 2.0 // decimal
var result = 5 * pow(n, 2)
print(result)
// 20.0
Run Code Online (Sandbox Code Playgroud)