Swift의 지수 연산자


답변:


96

연산자는 없지만 다음과 같이 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과 충돌하지 않습니다.
Kevin

3
^ 연산자는 Swift에서 XOR로 정의됩니다.
Kostiantyn Koval 2014 년

22
경고! 여기에 문제가 있습니다. 예를 들어, 일반적으로 프로그래밍 언어에서 -2.0**2.0 = -(2.0**2.0) = -4.0. 그러나 여기 -2.0**2.0 = (-2.0)**2.0 = 4.0에서는 의도 한 용도가 아닐 수 있으며 버그를 추적하기가 매우 어렵고 어려울 수 있습니다.
Daniel Farrell 2015

NSHipster는 유사한 설명을 사용하지만 일치하는 우선 순위는 160입니다. <<>>. 우선 순위가 다르면 코드 해석이 달라 지므로 공통 연산자에 대한 우선 순위를 표준화하는 것이 중요합니다. 나는 가장 좋은 표준이 무엇인지 알고 있지만 포기하지 않는 << 2** 2우선 순위가 같은 것은 몇 가지 의미가 있습니다. nshipster.com/swift-operators
Omegaman

8
지수가 올바른 연관성이 아닌가? en.wikipedia.org/wiki/Operator_associativity
vwvan

28

2를 어느 정도 거듭 제곱하는 경우 비트 왼쪽 시프트 연산자를 사용할 수 있습니다.

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

'파워'값은 생각보다 1이 적습니다.

이것은보다 빠르며 pow(2.0, 8.0)복식을 사용하지 않아도됩니다.


2
이것은 그것이가는 한 좋지만 실제로 질문에 대답하지 않습니다.
Chris

1
나는 2의 거듭 제곱에 관심이 있었기 때문에 대답했습니다.
dldnh

@chanceoperation 또는 2를 n의 거듭 제곱으로 1 또는 0b00000001을 n 자리 왼쪽으로 이동할 수 있습니다. Swift Advanced Operators let x = 0b00000001 << exponent // 2**exponent let x = 1 << 0 // 1 let x = 1 << 2 // 4 let x = 1 << 8 // 256
경고음

13

**중위 연산자 의 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

5
좋은. import Darwin얻는 것을 잊지 마세요pow
iainH

4
연관성은 오른쪽이 아니라 왼쪽이어야합니다. 2 ^ 3 ^ 2는 512가 아니라 64입니다.
brandonscript

글쎄요, 파이썬과 자바 스크립트 모두에서 2**3**264가 아니라 512입니다. 저는 왼쪽 연관 지수 연산자를 사용하는 프로그래밍 언어를 모릅니다. 그들은 모두 우연입니다. Swift에서 이것을 구현하는 경우, 다른 인기있는 언어 및 수학적 규칙 과 일관성을 유지하기 위해 올바른 연관성을 확실히해야합니다 .
Ray Toal 19.11.

5

나는 그렇게했다 :

operator infix ** { associativity left precedence 200 }

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

이 보인다 ... 비효율적
SAM-W

4

스위프트 4.2

import Foundation

var n = 2.0 // decimal
var result = 5 * pow(n, 2)
print(result)
// 20.0


2

Int유형 에 대한 지수 연산자에 특히 관심이 있다면 부동 소수점 숫자가 메모리에서 표현되는 방식으로 인해 기존 답변이 특히 큰 숫자에 대해 잘 작동하지 않을 것이라고 생각합니다. 로 변환 할 때 Float또는 Double에서 Int(에 의해 요구되는 당시와 pow, powfpowl의 함수 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
}


0

대안은 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.