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?
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?
Podobnie jak większość języków z rodziny C, nie ma żadnego.
Nie ma jednej, ale masz funkcję pow
.
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
zrobiłem to tak:
operator infix ** { associativity left precedence 200 }
func ** (base: Double, power: Double) -> Double {
return exp(log(base) * power)
}
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.
To jest miłe, o ile idzie, ale tak naprawdę nie odpowiada na pytanie. – Chris
Zainteresowałem się potęgą dwojga, więc odpowiedziała mi na to. – dldnh
@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
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
Nice. Nie zapomnij "importować Darwina", aby uzyskać 'pow' – iainH
. Dość pewność, że skojarzenie powinno zostać pozostawione, a nie w porządku. 2^3^2 to 64, a nie 512. – brandonscript
Lepiej użyć '**', więc można go używać na wskazówki i nie są sprzeczne z XOR. – Kevin
^Operator jest zdefiniowany jako XOR w Swift. –
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. –