我没有在Swift语言参考的基本算术运算符中看到定义的幂运算符。
语言中真的没有预定义的整数或浮点运算符吗?
我没有在Swift语言参考的基本算术运算符中看到定义的幂运算符。
语言中真的没有预定义的整数或浮点运算符吗?
Answers:
没有操作员,但是您可以使用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
**
,因此您可以在整数上使用它,而不会与XOR冲突。
-2.0**2.0 = -(2.0**2.0) = -4.0
。但是,这里-2.0**2.0 = (-2.0)**2.0 = 4.0
可能不是预期的用途,并且可能导致非常讨厌且难以跟踪的错误。
<<
和>>
。不同的优先级将导致不同的代码解释,因此,标准化通用运算符的优先级非常重要。我不知道最好的标准是什么,但给人<< 2
和** 2
相同的优先级有一定的道理。 nshipster.com/swift-operators
如果碰巧将2提高到一定的幂,则可以使用按位左移运算符:
let x = 2 << 0 // 2
let y = 2 << 1 // 4
let z = 2 << 7 // 256
注意,“ power”值比您想象的小1。
请注意,这比执行速度更快,pow(2.0, 8.0)
并且可以避免使用双精度。
let x = 0b00000001 << exponent // 2**exponent let x = 1 << 0 // 1 let x = 1 << 2 // 4 let x = 1 << 8 // 256
对于正在寻找Swift 3版本的用户 **
infix运算符的用户:
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
import Darwin
得到pow
如果您对Int
类型的幂运算符特别感兴趣,我认为由于内存中浮点数的表示方式,现有答案对于大数不会特别有效。当转换到Float
或Double
从Int
,然后返回(这是由需要pow
,powf
和powl
功能Darwin
模块)可能会丢失精度。这是用于的精确版本Int
:
let pow = { Array(repeating: $0, count: $1).reduce(1, *) }
请注意,此版本的内存使用效率不是特别高,并且已针对源代码大小进行了优化。
不会创建中间数组的另一个版本:
func pow(_ x: Int, _ y: Int) -> Int {
var result = 1
for i in 0..<y {
result *= x
}
return result
}
一个替代的答案是使用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