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?
swift
exponentiation
mcgregor94086
quelle
quelle
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
quelle
**
, 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-operatorsWenn 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.quelle
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
quelle
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 .Ich habe es so gemacht:
operator infix ** { associativity left precedence 200 } func ** (base: Double, power: Double) -> Double { return exp(log(base) * power) }
quelle
Swift 4.2
import Foundation var n = 2.0 // decimal var result = 5 * pow(n, 2) print(result) // 20.0
quelle
Es gibt keine, aber Sie haben die
pow
Funktion.quelle
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 konvertierenFloat
oderDouble
ausInt
und dann wieder zurück (die durch erforderlich istpow
,powf
undpowl
Funktionen inDarwin
Modul) können Sie Präzision verlieren . Hier ist eine genaue Version fürInt
: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 }
quelle
Wie die meisten Sprachen der C-Familie gibt es keine.
quelle
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
quelle