Ich sehe keinen Exponentiationsoperator, der in den Basisarithmetikoperatoren in der Swift-Sprachreferenz definiert ist.
Gibt es wirklich keinen vordefinierten Integer- oder Float-Exponentiationsoperator in der Sprache?
Ich sehe keinen Exponentiationsoperator, der in den Basisarithmetikoperatoren in der Swift-Sprachreferenz definiert ist.
Gibt es wirklich keinen vordefinierten Integer- oder Float-Exponentiationsoperator in der Sprache?
Antworten:
Es gibt keinen Operator, aber Sie können die pow-Funktion folgendermaßen verwenden:
return pow(num, power)
Wenn Sie möchten, können Sie auch einen Operator veranlassen, die pow-Funktion wie folgt aufzurufen:
infix operator ** { associativity left precedence 170 }
func ** (num: Double, power: Double) -> Double{
return pow(num, power)
}
2.0**2.0 //4.0
**
, damit Sie es für Ints verwenden können und nicht mit XOR in Konflikt stehen.
-2.0**2.0 = -(2.0**2.0) = -4.0
. Dies ist jedoch -2.0**2.0 = (-2.0)**2.0 = 4.0
möglicherweise nicht die beabsichtigte Verwendung und kann zu einem ziemlich bösen und schwer auffindbaren Fehler führen.
<<
und übereinzustimmen >>
. Unterschiedliche Prioritäten führen zu unterschiedlichen Code-Interpretationen. Daher ist es wichtig, eine Priorität für gemeinsame Operatoren festzulegen. Ich weiß nicht, was der beste Standard ist, aber Geben << 2
und ** 2
der gleiche Vorrang machen Sinn. nshipster.com/swift-operators
Wenn Sie zufällig 2 auf eine bestimmte Leistung erhöhen, können Sie den bitweisen Linksverschiebungsoperator verwenden:
let x = 2 << 0 // 2
let y = 2 << 1 // 4
let z = 2 << 7 // 256
Beachten Sie, dass der Wert 'power' 1 weniger ist, als Sie vielleicht denken.
Beachten Sie, dass dies schneller ist als pow(2.0, 8.0)
und Sie vermeiden müssen, Doppel zu verwenden.
let x = 0b00000001 << exponent // 2**exponent let x = 1 << 0 // 1 let x = 1 << 2 // 4 let x = 1 << 8 // 256
Für alle, die nach einer Swift 3-Version des **
Infix-Operators suchen :
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
zu bekommenpow
2**3**2
ist 512, nicht 64. Ich kenne keine Programmiersprache mit einem linksassoziativen Exponentiationsoperator. Sie sind alle richtig assoziativ. Wenn Sie dies in Swift implementieren, sollten Sie es auf jeden Fall richtig assoziativ tun, um mit anderen gängigen Sprachen sowie mit mathematischen Konventionen konsistent zu sein .
Wenn Sie sich speziell für den Exponentiationsoperator für Int
Typ interessieren , denke ich nicht, dass vorhandene Antworten aufgrund der Art und Weise, wie Gleitkommazahlen im Speicher dargestellt werden, für große Zahlen besonders gut funktionieren würden. Wenn zu konvertieren Float
oder Double
aus Int
und dann wieder zurück (die durch erforderlich ist pow
, powf
und powl
Funktionen in Darwin
Modul) können Sie Präzision verlieren . Hier ist eine genaue Version für Int
:
let pow = { Array(repeating: $0, count: $1).reduce(1, *) }
Beachten Sie, dass diese Version nicht besonders speichereffizient ist und für die Quellcodegröße optimiert ist.
Eine andere Version, die kein Zwischenarray erstellt:
func pow(_ x: Int, _ y: Int) -> Int {
var result = 1
for i in 0..<y {
result *= x
}
return result
}
Wie die meisten Sprachen der C-Familie gibt es keine.
Eine alternative Antwort ist die Verwendung von NSExpression
let mathExpression = NSExpression(format:"2.5**2.5")
let answer = mathExpression.expressionValue(with: nil, context: nil) as? Double
oder
let mathExpression = NSExpression(format:"2**3")
let answer = mathExpression.expressionValue(with: nil, context: nil) as? Int