Я не вижу оператора возведения в степень, определенного в базовых арифметических операторах в справочнике по языку Swift.
Действительно ли в языке нет предопределенного оператора возведения в степень целого числа или числа с плавающей запятой?
Я не вижу оператора возведения в степень, определенного в базовых арифметических операторах в справочнике по языку Swift.
Действительно ли в языке нет предопределенного оператора возведения в степень целого числа или числа с плавающей запятой?
Ответы:
Оператора нет, но вы можете использовать функцию pow следующим образом:
return pow(num, power)
Если хотите, вы также можете заставить оператор вызывать функцию pow следующим образом:
infix operator ** { associativity left precedence 170 }
func ** (num: Double, power: Double) -> Double{
return pow(num, power)
}
2.0**2.0 //4.0
**
, чтобы вы могли использовать его в int и не конфликтовать с XOR.
-2.0**2.0 = -(2.0**2.0) = -4.0
. Однако здесь -2.0**2.0 = (-2.0)**2.0 = 4.0
это может быть не по назначению и может вызвать довольно неприятную и трудную для отслеживания ошибку.
<<
и >>
. Различные приоритеты приведут к разной интерпретации кода, поэтому важна стандартизация приоритета для общих операторов. Я не знаю , что лучший стандарт, но дает << 2
и ** 2
тот же приоритет имеет некоторый смысл. nshipster.com/swift-operators
Если вы увеличиваете 2 до некоторой степени, вы можете использовать оператор побитового сдвига влево:
let x = 2 << 0 // 2
let y = 2 << 1 // 4
let z = 2 << 7 // 256
Обратите внимание, что значение «мощности» на 1 меньше, чем вы думаете.
Обратите внимание, что это быстрее, чем pow(2.0, 8.0)
и позволяет избежать использования двойников.
let x = 0b00000001 << exponent // 2**exponent let x = 1 << 0 // 1 let x = 1 << 2 // 4 let x = 1 << 8 // 256
Для тех, кто ищет версию **
инфиксного оператора для Swift 3 :
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
получитьpow
2**3**2
это 512, а не 64. Я не знаю ни одного языка программирования с левоассоциативным оператором возведения в степень. Все они правильно-ассоциативны. Если вы реализуете это в Swift, вам обязательно следует сделать это правильно-ассоциативным, чтобы соответствовать другим популярным языкам, а также математическим соглашениям .
Если вас особенно интересует оператор возведения в степень для Int
типа, я не думаю, что существующие ответы будут особенно хорошо работать для больших чисел из-за того, как числа с плавающей запятой представлены в памяти. При преобразовании в Float
или Double
из , Int
а затем обратно (что требуется pow
, powf
и powl
функции в Darwin
модуле) вы можете потерять точность . Вот точная версия для Int
:
let pow = { Array(repeating: $0, count: $1).reduce(1, *) }
Обратите внимание, что эта версия не особенно эффективно использует память и оптимизирована для размера исходного кода.
Другая версия, которая не создает промежуточный массив:
func pow(_ x: Int, _ y: Int) -> Int {
var result = 1
for i in 0..<y {
result *= x
}
return result
}
Как и в большинстве языков семейства C, его нет.
Альтернативный ответ - использовать NSExpression
let mathExpression = NSExpression(format:"2.5**2.5")
let answer = mathExpression.expressionValue(with: nil, context: nil) as? Double
или же
let mathExpression = NSExpression(format:"2**3")
let answer = mathExpression.expressionValue(with: nil, context: nil) as? Int