Swift & UI 进阶 25m
探索 Swift 数值计算
Explore numerical computing in Swift
2020年6月24日
一句话判断
如果你在用 Swift 做机器学习或科学计算,这场 Session 展示了 Swift Numerics 库如何弥合 Swift 和传统数值计算生态之间的差距。
这场 Session 讲了什么
这场 Session 由 Swift 核心团队成员主讲,深入探讨了 Swift 在数值计算领域的能力和未来方向。重点介绍了 Swift Numerics——一个 Apple 维护的开源库,为 Swift 提供高质量的数学函数和数值类型。演讲者从浮点数精度问题讲起,解释了为什么标准库的数学函数在某些边界情况下表现不够理想,以及 Swift Numerics 如何解决这些问题。
Session 的核心内容围绕三个模块展开:RealFunctions(实数函数集)、ComplexModule(复数运算)和 Approximate(近似计算工具)。演讲者通过大量代码示例展示了如何用这些模块替代 C 标准库中的数学函数,同时获得更好的类型安全性和性能。特别值得关注的是对 SIMD 类型的支持,Apple 展示了如何利用 Swift 的泛型系统让同一套数学函数同时适用于标量和向量运算。
最后,演讲者展望了 Swift 在数值计算领域的未来路线图,包括对自动微分(Automatic Differentiation)的支持和与 TensorFlow 生态的进一步整合。
值得深挖的点
- Complex 数类型的实现策略:Swift Numerics 的 Complex 类型使用泛型参数来约束底层实数类型,这意味着你可以用
Complex<Float>也可以用Complex<Double>,甚至未来可以扩展到自定义精度。设计上借鉴了 C++ std::complex 但利用了 Swift 的 protocol-oriented 特性,让 API 更安全。 - Elementary Functions 的精度保证:Swift Numerics 对数学函数的精度要求非常严格——每个函数在定义域内的最大误差不超过 1 ULP(Unit in the Last Place)。这比很多平台的 libm 实现都要精确,对科学计算和机器学习场景意义重大。
代码片段
// 使用 Swift Numerics 的复数运算
import ComplexModule
let z = Complex<Double>(3.0, 4.0) // 3 + 4i
let magnitude = abs(z) // 5.0
let phase = z.phase // atan2(4, 3)
let conjugate = z.conjugate // 3 - 4i
// 复数的指数运算
let expZ = exp(z) // 欧拉公式 e^(3+4i)
// 使用 RealFunctions 获得高精度数学运算
import RealModule
func computeGaussian<T: Real>(
x: T, mean: T, std: T
) -> T {
let exponent = -((x - mean) * (x - mean)) / (2 * std * std)
return exp(exponent) / (std * sqrt(2 * .pi))
}
// 适用于 Float 和 Double,甚至 SIMD 类型
let result = computeGaussian(x: 1.5, mean: 0.0, std: 1.0)
// SIMD 向量化的数值计算
import simd
func batchSigmoid(_ x: SIMD4<Float>) -> SIMD4<Float> {
// 利用 SIMD 并行计算四个 sigmoid 值
1.0 / (1.0 + exp(-x))
}
let inputs = SIMD4<Float>(-1.0, 0.0, 1.0, 2.0)
let outputs = batchSigmoid(inputs)
// [0.2689, 0.5, 0.7311, 0.8808]
最佳实践
- 涉及浮点数比较时,不要用
==,使用相对误差或 ULP 距离来判断相等性 - 科学计算场景优先使用 Swift Numerics 而非 Darwin 的 libm,前者提供更好的精度保证和类型安全
- 利用 Swift 的泛型约束编写同时适用于 Float 和 Double 的数值算法,避免代码重复
- SIMD 操作能显著提升批量数值计算的吞吐量,适合图像处理和神经网络推理场景
还有什么值得关注
- Swift Numerics 是开源项目,可以在 GitHub 上直接参与贡献和查看实现细节
- Apple 的 Swift for TensorFlow 项目虽然已经暂停,但其自动微分的设计思路可能会融入 Swift 主线
- 搭配 “What’s new in Swift” 一起看,可以了解 Swift 5.3 在性能和语言特性上的改进
WWDC 2020