Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中的求幂算子_Swift_Exponentiation - Fatal编程技术网

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

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


语言中真的没有预定义的整数或浮点求幂运算符吗?

像大多数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中实现此功能,您肯定应该正确地实现关联性,以与其他流行语言保持一致。这似乎……效率低下在我的情况下,这是解决方案: