[关闭]
@levinzhang 2019-11-21T21:02:48.000000Z 字数 1521 阅读 596

Swift Numerics致力于让Swift更适合数值计算

by

摘要:

苹果的工程师Steve Cannon说,Swift Numerics是一个新的Swift开源库,它试图填补Swift标准库(Standard Library)的空白。目前,它包含两个模块,分别用于实数和复杂的数学计算,但是在它的路线图上有更多的内容。


苹果的工程师Steve Cannon说,Swift Numerics是一个新的Swift开源库,它试图填补Swift标准库(Standard Library)的空白。目前,它包含两个模块,分别用于实数和复杂的数学计算,但是在它的路线图上有更多的内容

按照目前的决策,Swift Numerics依然保持在其自身的包中,而不是位于标准库中,这主要是因为编译器的一些限制,这些限制阻碍了新API的实现,因为实现的方式必须要满足Swift对跨语言版本源代码稳定性的承诺。尽管如此,并不排除Swift Numerics将来可能会转移到标准库的可能性。无需多言,只有那些足够通用的特性才能考虑加入到标准库之中。

Swift Numerics是一个模块化的库,这意味着我们可以只导入所需的模块。例如,如下展现了如何只导入Complex模块:

  1. import Complex

另外,我们还可以按照这些写法导入整个Numerics API:

  1. import Numerics

Real模块定义了三个协议:ElementaryFunctionsRealFunctionsReal,Cannon说,最后一个是其中最重要的。

Real描述了一个浮点类型,它提供了完整的数字函数集,比如explogcospow等等。其强大之处在于,借助它,我们可以编写通用的代码,这些代码能够无缝地集成到Swift未来会添加的新浮点类型中,比如Float16Float128。上文提到的另外两个协议用于分区(partition)函数,它们可以很容易地扩展至比实数更通用的数字字段,或者扩展至非实数字段。后者包括像exp2exp10gammalogGamma等众多的函数。

Complex数字构建在Real之上:

  1. public struct Complex<RealType> where RealType: Real {
  2. ...
  3. }

借助简单直接的语法,我们可以针对复杂数字进行基本的计算操作:

  1. import Complex
  2. // 声明一个复杂数字:
  3. let z: Complex<Double> = 2 + 3 * .i
  4. print(z) // (2.0, 3.0)
  5. print(z.real) // 2.0
  6. print(z.imaginary) // 3.0
  7. let w = Complex<Double>(1, -2.5)
  8. let zz = z + zz
  9. let p = z * Complex(0, 2.5)

据Cannon所言,与C代码相比,Swift Numerics提供了更好的性能。这主要是由于对0和NaN的处理进行了简化。虽然C(和c++)倾向于区分不同类型的0和NaNs,但是Swift Numerics倾向于丢失一些信息来简化代码,这减少了程序员保持安全性和正确性的开销,并带来了显著的速度优化。

最后值得一提的是,Swift Numerics依然处于活跃的开发之中,未来会加入更多的类型,包括Float16(https://github.com/apple/swift-numerics/issues/8)、超过64位的固定宽度的整数、表示多维同构数据的ShapedArray 协议等。

查看英文原文:Swift Numerics Aims to Make Swift Suitable for Numerical Computing

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注