Я не могу воспроизвести эту проблему, но вы написали, что это довольно неловкий способ, ИМО.Вы хотите, чтобы все было Double, поэтому просто сделайте это Double, и тогда код станет намного проще, и вам не понадобится все приведение.pow(x,2)
также очень дорогой способ вычисления x*x
, поэтому я бы избавился от этого, и я думаю, что код становится намного проще и определенно не имеет проблем с компиляцией.
func cal(xs: [Int], ys: [Int64]) -> Double {
let xs = xs.lazy.map(Double.init)
let ys = ys.lazy.map(Double.init)
let total = ys.reduce(0, +)
return zip(xs, ys).map { $0*$0 * $1 }.reduce(0, +) / total
}
Если вы делаете много такого рода кода, вы можете найти расширение sum()
полезным, чтобы сделать код немного понятнее.
extension Sequence where Element: Numeric {
func sum() -> Element {
return reduce(0, +)
}
}
func cal(xs: [Int], ys: [Int64]) -> Double {
let xs = xs.lazy.map(Double.init)
let ys = ys.lazy.map(Double.init)
let total = ys.sum()
return zip(xs, ys).map { $0*$0 * $1 }.sum() / total
}