Swift中的求幂算子
我没有看到Swift语言参考中的基本算术运算符中定义的求幂运算符Swift中的求幂算子,swift,exponentiation,Swift,Exponentiation,我没有看到Swift语言参考中的基本算术运算符中定义的求幂运算符 语言中真的没有预定义的整数或浮点求幂运算符吗?像大多数C语言家族一样,没有一个。没有一个,但是您有pow函数。没有运算符,但是您可以像这样使用pow函数: return pow(num, power) infix operator ** { associativity left precedence 170 } func ** (num: Double, power: Double) -> Double{ ret
语言中真的没有预定义的整数或浮点求幂运算符吗?像大多数C语言家族一样,没有一个。没有一个,但是您有
pow
函数。没有运算符,但是您可以像这样使用pow函数:
return pow(num, power)
infix operator ** { associativity left precedence 170 }
func ** (num: Double, power: Double) -> Double{
return pow(num, power)
}
2.0**2.0 //4.0
如果需要,还可以让操作员调用pow函数,如下所示:
return pow(num, power)
infix operator ** { associativity left precedence 170 }
func ** (num: Double, power: Double) -> Double{
return pow(num, power)
}
2.0**2.0 //4.0
我是这样做的:
operator infix ** { associativity left precedence 200 }
func ** (base: Double, power: Double) -> Double {
return exp(log(base) * power)
}
如果碰巧将2提高到某个幂,可以使用按位左移位运算符:
let x = 2 << 0 // 2
let y = 2 << 1 // 4
let z = 2 << 7 // 256
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
let x=2对于任何正在寻找Swift 3版本的**
中缀运算符的人:
let x = 2 << 0 // 2
let y = 2 << 1 // 4
let z = 2 << 7 // 256
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
如果您对Int
类型的求幂运算符特别感兴趣,那么我认为现有的答案对于大数不会特别有效,因为浮点数在内存中的表示方式。当从Int
转换到Float
或Double
然后再转换回来时(这是pow
模块中的powf
和powl
函数所必需的)。以下是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
}
func-pow(x:Int,y:Int)->Int{
var结果=1
对于0..中的i,另一个答案是使用NSExpression
let mathExpression = NSExpression(format:"2.5**2.5")
let answer = mathExpression.expressionValue(with: nil, context: nil) as? Double
或
Swift 4.2
import Foundation
var n = 2.0 // decimal
var result = 5 * pow(n, 2)
print(result)
// 20.0
最好使用**
,这样您就可以在整数上使用它,而不会与XOR冲突。^运算符在Swift中定义为XOR。警告!这里有一个问题。例如,通常在编程语言中,-2.0**2.0=-(2.0**2.0)=-4.0
。但是,这里-2.0**2.0=-2.0**2.0=4.0
,这可能不是预期的用途,可能会导致相当严重且难以追踪的错误。NSHipster使用类似的描述,但优先级为160,以匹配
。不同的优先级将导致不同的代码解释,因此标准化通用运算符的优先级是非常重要的rtant。我不知道什么是最好的标准,但给出不是右幂相关吗?这很好,但并不能真正回答问题。我对二的幂感兴趣,所以它为我提供了答案。@chanceoperation或者,对于2到n的幂,你可以将1或0b00000001向左移动n个位置让x=0b0000001很好。别忘了导入Darwin
以获得pow
非常确定关联性应该是左的,而不是右的。2^3^2是64,而不是512。好吧,在Python和JavaScript中2**3**2
都是512,而不是64。我不知道任何带有左关联求幂运算符的编程语言。它们都是正确的关联性。如果您在Swift中实现此功能,您肯定应该正确地实现关联性,以与其他流行语言保持一致。这似乎……效率低下在我的情况下,这是解决方案: