Я не вижу оператора возведения в степень, определенного в базовых арифметических операторах в справочнике по языку Swift.
Действительно ли в языке нет предопределенного оператора возведения в степень целого числа или числа с плавающей запятой?
swift
exponentiation
mcgregor94086
источник
источник
Ответы:
Оператора нет, но вы можете использовать функцию 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, вам обязательно следует сделать это правильно-ассоциативным, чтобы соответствовать другим популярным языкам, а также математическим соглашениям .Сделал так:
operator infix ** { associativity left precedence 200 } func ** (base: Double, power: Double) -> Double { return exp(log(base) * power) }
источник
Swift 4.2
import Foundation var n = 2.0 // decimal var result = 5 * pow(n, 2) print(result) // 20.0
источник
Его нет, но
pow
функция у вас есть .источник
Если вас особенно интересует оператор возведения в степень для
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
источник