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?
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?
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
**
, 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-operators
Si 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.
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
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 .
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 hacia Float
o Double
desde Int
y luego hacia atrás (que es requerido por pow
, powf
y powl
funciones en el Darwin
módulo) puede perder precisión . Aquí hay una versión precisa para Int
:
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
}
Como la mayoría de los idiomas de la familia C, no hay uno.
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