No veo un operador de exponenciación definido en los operadores aritméticos base en la referencia del lenguaje Swift.
¿Realmente no existe un operador de exponenciación de número entero o flotante predefinido en el idioma?
swift
exponentiation
mcgregor94086
fuente
fuente
Respuestas:
No hay un operador, pero puede usar la función pow de esta manera:
return pow(num, power)
Si lo desea, también puede hacer que un operador llame a la función pow de esta manera:
infix operator ** { associativity left precedence 170 } func ** (num: Double, power: Double) -> Double{ return pow(num, power) } 2.0**2.0 //4.0
fuente
**
, para que pueda usarlo en ints y no entrar en conflicto con XOR.-2.0**2.0 = -(2.0**2.0) = -4.0
. Sin embargo, aquí-2.0**2.0 = (-2.0)**2.0 = 4.0
, que podría no ser el uso previsto y podría causar un error bastante desagradable y difícil de rastrear.<<
y>>
. Diferentes precedentes conducirán a diferentes interpretaciones del código, por lo que es importante estandarizar una precedencia para operadores comunes. No sé cuál es el mejor estándar, pero dar<< 2
y** 2
la misma precedencia tiene algún sentido. nshipster.com/swift-operatorsSi aumenta 2 a algo de potencia, puede usar el operador de desplazamiento a la izquierda bit a bit:
let x = 2 << 0 // 2 let y = 2 << 1 // 4 let z = 2 << 7 // 256
Observe que el valor de 'potencia' es 1 menos de lo que podría pensar.
Tenga en cuenta que esto es más rápido que
pow(2.0, 8.0)
y le permite evitar tener que usar dobles.fuente
let x = 0b00000001 << exponent // 2**exponent let x = 1 << 0 // 1 let x = 1 << 2 // 4 let x = 1 << 8 // 256
Para cualquiera que busque una versión Swift 3 del
**
operador infijo: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
fuente
import Darwin
conseguirpow
2**3**2
es 512, no 64. No conozco ningún lenguaje de programación con un operador de exponenciación asociativo a la izquierda. Todos son asociativos a la derecha. Si implementa esto en Swift, definitivamente debería hacerlo correctamente asociativo para ser consistente con otros lenguajes populares, así como con las convenciones matemáticas .Lo hice así:
operator infix ** { associativity left precedence 200 } func ** (base: Double, power: Double) -> Double { return exp(log(base) * power) }
fuente
Rápido 4.2
import Foundation var n = 2.0 // decimal var result = 5 * pow(n, 2) print(result) // 20.0
fuente
No hay uno, pero tienes la
pow
función.fuente
Si está específicamente interesado en el operador de exponenciación para el
Int
tipo, no creo que las respuestas existentes funcionen particularmente bien para números grandes debido a la forma en que los números de punto flotante se representan en la memoria. Al convertir haciaFloat
oDouble
desdeInt
y luego hacia atrás (que es requerido porpow
,powf
ypowl
funciones en elDarwin
módulo) puede perder precisión . Aquí hay una versión precisa paraInt
:let pow = { Array(repeating: $0, count: $1).reduce(1, *) }
Tenga en cuenta que esta versión no es particularmente eficiente en memoria y está optimizada para el tamaño del código fuente.
Otra versión que no creará una matriz intermedia:
func pow(_ x: Int, _ y: Int) -> Int { var result = 1 for i in 0..<y { result *= x } return result }
fuente
Como la mayoría de los idiomas de la familia C, no hay uno.
fuente
Una respuesta alternativa es usar NSExpression
let mathExpression = NSExpression(format:"2.5**2.5") let answer = mathExpression.expressionValue(with: nil, context: nil) as? Double
o
let mathExpression = NSExpression(format:"2**3") let answer = mathExpression.expressionValue(with: nil, context: nil) as? Int
fuente