BaseMath 提供了一系列用于处理 Swift 中浮点数和双精度数组的基本数学函数,可在 Mac 或 Linux 上使用,无需任何依赖,通过 BaseVector
协议实现。由于使用了指针,避免了 Swift 的写入时复制检查的开销,所以通常比标准的 Swift 循环或 map 快 3-5 倍。提供了以下函数(所有函数都有一个以 _
结尾的版本和一个以 sum
开头的版本 - 详见下文)
sqr
, abs
, min
, max
, pow
, atan2
, copysign
, fdim
, fmax
, fmin
, hypot
, nextafter
, add
, sub
, mul
, div
, subRev
, divRev
acos
, acosh
, asin
, asinh
, atan
, atanh
, cbrt
, cos
, cosh
, erf
, erfc
, exp
, exp2
, expm1
, log
, log10
, log1p
, log2
, logb
, nearbyint
, rint
, sin
, sinh
, tan
, tanh
, tgamma
通过添加到你的 Package.swift
文件,即可使用 Swift Package Manager 来使用它。
dependencies: [
.package(url:"https://github.com/jph00/BaseMath.git", from: "1.0.0"),
]
为了获得合理的性能,请使用 make
编译(如果您修改了 gyb
模板,这也必不可少)或者使用:
swift build -Xswiftc -Ounchecked -Xcc -ffast-math -Xcc -O2 -Xcc -march=native
该库被 SwiftyMKL 使用,它添加了来自 Intel 性能库的函数的更多优化版本,以及各种线性代数和统计函数。
使用了来自 Foundation
的数学函数 (而 Foundation
又提供了 math.h
中可用的函数),除了 sum()
(以及 sum${f}()
, 其中 ${f}
是 math.h
中的函数名),因为 Swift 中的规约目前没有矢量化,所以它们是用 C 编写的。还提供了标准的数学运算符,包括优化的赋值版本。带有 _
后缀的函数是就地操作。此外,还提供了 sqr
函数。 请注意,abs
在 C 版本中被称为 fabs
,因为在 math.h
中就是这样调用的。
由于该库使用了指针,因此 Swift 的写入时复制和 let
不可变性被绕过。使用提供的 copy()
方法获取 Array
的真实副本。
为了避免意外情况,您可能更喜欢使用提供的 AlignedStorage
结构,该结构支持与 Array
大致相同的功能,但不使用写入时复制,并且对齐内存以获得(有时)更好的性能。 此外,扩展了 UnsafeMutableBufferPointer
以符合 BaseVector
,因此它也获得了相同的功能。
在 import BaseVector
之后,您会发现所有标准的单目和双目数学函数都已添加到浮点数和双精度数的 Array
中,以及每个函数以 sum
开头的归约版本(例如 sumabs
、sumcos
等)。
有关使用示例,请参见测试套件(请注意,由于 objective-c xctest 问题,测试无法在 Mac 上运行)。 有关背景和实现细节的更多信息,请参见[本文] (TBA)。