Swift中的指数运算符

时间:2014-06-05 16:46:45

标签: swift exponentiation

我没有在Swift语言参考中看到基本算术运算符中定义的取幂运算符。

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

9 个答案:

答案 0 :(得分:78)

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

return pow(num, power)

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

infix operator ** { associativity left precedence 170 }

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

2.0**2.0 //4.0

答案 1 :(得分:22)

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

let x = 2 << 0    // 2
let y = 2 << 1    // 4
let z = 2 << 7    // 256

请注意&#39;电源&#39;价值比你想象的要少1。

请注意,这比pow(2.0, 8.0)快,可以避免使用双打。

答案 2 :(得分:12)

对于寻找**中缀运算符的Swift 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

答案 3 :(得分:5)

我是这样做的:

operator infix ** { associativity left precedence 200 }

func ** (base: Double, power: Double) -> Double {
    return exp(log(base) * power)
}

答案 4 :(得分:3)

没有一个,但你有pow功能。

答案 5 :(得分:1)

与大多数C系列语言一样,没有一种语言。

答案 6 :(得分:1)

如果您对Int类型的幂运算符特别感兴趣,我不认为现有答案对于大数会特别有效,因为在内存中如何表示浮点数。从Float转换为DoubleInt并返回时({{1中的powpowfpowl函数需要}}模块)you may lose precision。这是Darwin的精确版本:

Int

请注意,此版本的存储效率不是特别高,并且已针对源代码大小进行了优化。

不会创建中间数组的另一个版本:

let pow = { Array(repeating: $0, count: $1).reduce(1, *) }

答案 7 :(得分:0)

另一种选择是使用NSExpression

let mathExpression = NSExpression(format:"2.5**2.5")
let answer = mathExpression.expressionValue(with: nil, context: nil) as? Double

let mathExpression = NSExpression(format:"2**3")
let answer = mathExpression.expressionValue(with: nil, context: nil) as? Int

答案 8 :(得分:0)

Swift 4.2

var n = 1.0
var result = 45 * pow(n, 3) + 20 * pow(n, 2) + 19
print(result)
// 84.0