2014-06-05 9 views
45

Nie widzę operatora potęgowania zdefiniowanego w podstawowych operacjach arytmetycznych w odnośniku języka Swift.Operator potęgowania w Swift

Czy naprawdę nie ma zdefiniowanego operatora liczby całkowitej lub zmiennoprzecinkowego w języku?

Odpowiedz

1

Podobnie jak większość języków z rodziny C, nie ma żadnego.

2

Nie ma jednej, ale masz funkcję pow.

56

Nie jest operatorem, ale można użyć pow funkcję tak:

return pow(num, power) 

Jeśli chcesz, możesz także wykonać połączenie operatorowi funkcji pow tak:

infix operator ** { associativity left precedence 170 } 

func ** (num: Double, power: Double) -> Double{ 
    return pow(num, power) 
} 

2.0**2.0 //4.0 
+0

Lepiej użyć '**', więc można go używać na wskazówki i nie są sprzeczne z XOR. – Kevin

+2

^Operator jest zdefiniowany jako XOR w Swift. –

+14

Ostrzeżenie! Tutaj jest problem. Na przykład, zwykle w językach programowania, '-2.0 ** 2.0 = - (2.0 ** 2.0) = -4.0'. Jednak tutaj '-2.0 ** 2.0 = (-2.0) ** 2.0 = 4.0', które mogą nie być przeznaczone do użycia i może powodować dość nieprzyjemny i trudny do znalezienia błąd. –

6

zrobiłem to tak:

operator infix ** { associativity left precedence 200 } 

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

Jeśli zdarzy ci się być podniesienie 2 do jakiejś mocy, można użyć operatora przesunięcia bitowego w lewo:

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

Należy zauważyć, że wartość "mocy" jest o 1 mniejsza, niż mogłoby się wydawać.

Należy pamiętać, że jest to szybciej niż pow(2.0, 8.0) i pozwala uniknąć konieczności używania podwójnych.

+1

To jest miłe, o ile idzie, ale tak naprawdę nie odpowiada na pytanie. – Chris

+1

Zainteresowałem się potęgą dwojga, więc odpowiedziała mi na to. – dldnh

+0

@chansoperation Alternatywnie, dla 2 do potęgi n możesz przesunąć 1 lub 0b00000001 w lewo o n miejsc [Swift Advanced Operators] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual /Swift_Programming_Language/AdvancedOperators.html) 'niech x = 0b00000001 << wykładnik // 2 ** wykładnik niech x = 1 << 0 // 1 niech x = 1 << 2 // 4 niech x = 1 << 8 // 256' – beepscore

9

Dla każdego, kto szuka Swift 3 wersji operatora ** Infix:

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 
+4

Nice. Nie zapomnij "importować Darwina", aby uzyskać 'pow' – iainH

+1

. Dość pewność, że skojarzenie powinno zostać pozostawione, a nie w porządku. 2^3^2 to 64, a nie 512. – brandonscript