web-dev-qa-db-ja.com

Swiftのべき乗演算子

Swift言語リファレンスの基本算術演算子で定義されているべき乗演算子は見当たりません。

言語には事前定義された整数または浮動小数点の指数演算子は本当にありませんか?

69
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
82
Connor

2をべき乗する場合は、ビット単位の左シフト演算子を使用できます。

let x = 2 << 0    // 2
let y = 2 << 1    // 4
let z = 2 << 7    // 256

'power'値は、あなたが考えているよりも1少ないことに注意してください。

これはpow(2.0, 8.0)よりも高速であり、doubleを使用する必要がなくなることに注意してください。

23
chanceoperation

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
12
reitermarkus

私はそうしました:

operator infix ** { associativity left precedence 200 }

func ** (base: Double, power: Double) -> Double {
    return exp(log(base) * power)
}
5
ldanilek

ありませんが、pow関数があります。

3
Rod

Int型のべき乗演算子に特に興味がある場合、メモリ内での浮動小数点数の表現方法が原因で、既存の回答が大きな数値に対して特にうまく機能するとは思わない。 FloatからDoubleまたはIntに変換してから戻す(powpowf、および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
}
2
Max Desiatov

Swift 4.2

var n = 1.0
var result = 45 * pow(n, 3) + 20 * pow(n, 2) + 19
print(result)
// 84.0
1
tymac

ほとんどのCファミリの言語と同様に、1つもありません。

1
David Berry

別の答えは、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
0
Ryan Heitner