Swift Numericsは、Swift Standard Libraryの不足部分を埋めることを目的とした、Swiftの新しいオープンソースライブラリだ — AppleのエンジニアであるSteve Cannon氏は、このように記している。現在時点では実数と虚数の数学計算を行う2つのモジュールが含まれているが、ロードマップにはさらに多くの予定が記載されている。
Swift Numericsを標準ライブラリ内ではなく、独自のパッケージにするという現在の判断は、Swiftの約束である言語バージョン間での互換性を維持するために、新たなAPIを実装することができないという、コンパイラの制限を主な動機とするものだ。しかしながら、Swift Numericが将来的にStandard Libraryに移行される可能性を、必ずしも否定するものではない。当然のことだが、十分な汎用性があれば、標準への取り込みが検討される可能性はある。
Swift Numericはモジュラライブラリなので、必要な場合のみインポートすればよい。以下の例は、Complexモジュールをインポートする方法を示すものだ。
import Complex
あるいは次のように記述して、Numerics API全体をインポートすることもできる。
import Numerics
Realモジュールには、3つのプロトコルが定義されている。ElementaryFunction、RealFunction、そして、3つの中で一番重要だとCannon氏の言う、Realである。
Realで定義される浮動小数点型には、exp、log、cos、powなど、一連の数値関数が用意されている。特徴として挙げられるのは、Float16やFloat128といった、Swiftに将来的に追加されるであろう新たな浮動小数点型にシームレスに適用できるような、ジェネリックなコードの記述が可能であることだ。上に挙げた2つ以外のプロトコルは、実数や現在対応しているもの以外にも、より汎用的に数値フィールドを容易に拡張できるようにするための、パーティション関数に使用されるものだ。後者の未対応なものには、expp、exp10、gamma、logGammaなど、多くのものが含まれている。
Complext数値は、Realをベースに作成されている。
public struct Complex<RealType> where RealType: Real {
...
}
次のような簡単な構文で、複素数の基本的な操作のほとんどを演算することが可能だ。
import Complex
// Declare a complex number:
let z: Complex<Double> = 2 + 3 * .i
print(z) // (2.0, 3.0)
print(z.real) // 2.0
print(z.imaginary) // 3.0
let w = Complex<Double>(1, -2.5)
let zz = z + zz
let p = z * Complex(0, 2.5)
Cannon氏によると、Swift Numericsは、Cのコードに匹敵する優れたパフォーマンスを提供する。これはおもに、ゼロとNaNの処理を簡略化したことによるものだ。C(およびC++)ではゼロやNaNを特別に扱う傾向があるのに対して、Swift Numericsではコードを単純化するために、多少の情報を失うのと引き換えに、安全性と正確性を保証するためのプログラマの負担を軽くしているのだ、とCannnon氏は説明している。
最後に注意すべき点として、Swift Numericsはまだ活発な開発中であり、今後、Float16や、64ビットを越える固定幅整数、多次元の同種データを表現するShapedArrayプロトコルなどの型が追加される予定である。