Я строю общий векторный класс в Swift с тремя типами: Float, Double и Int. Это работает до сих пор, но когда я пытаюсь вычислить длину вектора, я сталкиваюсь с проблемой.Общий квадратный корень в Swift
Формула длины вектора представляет собой квадратный корень из (x² + y²). Но так как я использую общий класс для своих векторов, значения x и y называются T.
Функция sqrt Swift принимает только Double как аргумент, но не имеет общего аргумента.
Можно ли использовать функцию sqrt с помощью общих параметров?
Вот фрагмент кода, который я использую для длины вектора и скалярного произведение:
protocol ArithmeticType {
func + (left: Self, right: Self) -> Self
func - (left: Self, right: Self) -> Self
func * (left: Self, right: Self) -> Self
func/(left: Self, right: Self) -> Self
prefix func - (left: Self) -> Self
func toDouble() -> Double
}
extension Double: ArithmeticType {
func toDouble() -> Double {
return Double(self)
}
}
extension Float: ArithmeticType {
func toDouble() -> Double {
return Double(self)
}
}
extension Int: ArithmeticType {
func toDouble() -> Double {
return Double(self)
}
}
class Vector<T where T: ArithmeticType, T: Comparable> {
var length: T { return sqrt((self ⋅ self).toDouble()) }
}
infix operator ⋅ { associativity left }
func ⋅<T: ArithmeticType> (left: Vector<T>, right: Vector<T>) -> T {
var result: T? = nil
for (index, value) in enumerate(left.values) {
let additive = value * right.values[index]
if result == nil {
result = additive
} else if let oldResult = result {
result = oldResult + additive
}
}
if let unwrappedResult = result {
return unwrappedResult
}
}
Даже для векторов целых чисел длина обычно представляет собой число с плавающей запятой (например, length ([1, 1] = sqrt (2)), поэтому вы можете просто наложить на 'Double' - Btw, где находится' ArithmeticType' defined? –
Почему бы вам не написать свою собственную функцию sqrt. Мне кажется, что для меня что-то похожее на функциональность c11, то вы можете настроить целые числа на пол, пол и т. Д. или использовать произвольную точность lib –