Je ne vois pas d'opérateur d'exponentiation défini dans les opérateurs arithmétiques de base dans la référence du langage Swift.
N'existe-t-il vraiment aucun opérateur prédéfini de type entier ou exponentionneur flottant dans le langage?
Il n'y a pas d'opérateur mais vous pouvez utiliser la fonction pow comme ceci:
return pow(num, power)
Si vous le souhaitez, vous pouvez également demander à un opérateur d'appeler la fonction pow de la manière suivante:
infix operator ** { associativity left precedence 170 }
func ** (num: Double, power: Double) -> Double{
return pow(num, power)
}
2.0**2.0 //4.0
Si vous élevez 2 à une certaine puissance, vous pouvez utiliser l'opérateur de décalage gauche au niveau du bit:
let x = 2 << 0 // 2
let y = 2 << 1 // 4
let z = 2 << 7 // 256
Notez que la valeur de "puissance" est 1 inférieure à ce que vous pourriez penser.
Notez que ceci est plus rapide que pow(2.0, 8.0)
et vous évite d’avoir à utiliser des doublons.
Pour ceux qui recherchent une version Swift 3 de l'opérateur **
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
Je l'ai fait comme ça:
operator infix ** { associativity left precedence 200 }
func ** (base: Double, power: Double) -> Double {
return exp(log(base) * power)
}
Il n'y en a pas, mais vous avez la fonction pow
.
Comme la plupart des langues de la famille C, il n'y en a pas.
Si vous êtes particulièrement intéressé par l'opérateur d'exponentiation pour le type Int
, je ne pense pas que les réponses existantes fonctionneraient particulièrement bien pour les grands nombres en raison de la façon dont les nombres en virgule flottante sont représentés en mémoire. Lors de la conversion en Float
ou Double
à partir de Int
puis en retour (requis par les fonctions pow
, powf
et powl
dans le module Darwin
) vous risquez de perdre la précision . Voici une version précise pour Int
:
let pow = { Array(repeating: $0, count: $1).reduce(1, *) }
Notez que cette version n’est pas particulièrement efficace en mémoire et est optimisée pour la taille du code source.
Une autre version qui ne créera pas de tableau intermédiaire:
func pow(_ x: Int, _ y: Int) -> Int {
var result = 1
for i in 0..<y {
result *= x
}
return result
}
Swift 4.2
var n = 1.0
var result = 45 * pow(n, 3) + 20 * pow(n, 2) + 19
print(result)
// 84.0
Une autre solution consiste à utiliser NSExpression.
let mathExpression = NSExpression(format:"2.5**2.5")
let answer = mathExpression.expressionValue(with: nil, context: nil) as? Double
ou
let mathExpression = NSExpression(format:"2**3")
let answer = mathExpression.expressionValue(with: nil, context: nil) as? Int