Swift Numerics開源庫:讓Swift更適合數值計算

蘋果的工程師Steve Cannon說,Swift Numerics是一個新的Swift開源庫,它試圖填補Swift標準庫(Standard Library)的空白。目前,它包含兩個模塊,分別用於實數和複雜的數學計算,但是在它的路線圖上有更多的內容

按照目前的決策,Swift Numerics依然保持在其自身的包中,而不是位於標準庫中,這主要是因爲編譯器的一些限制,這些限制阻礙了新API的實現,因爲實現的方式必須要滿足Swift對跨語言版本源代碼穩定性的承諾。儘管如此,並不排除Swift Numerics將來可能會轉移到標準庫的可能性。無需多言,只有那些足夠通用的特性才能考慮加入到標準庫之中。

Swift Numerics是一個模塊化的庫,這意味着我們可以只導入所需的模塊。例如,如下展現瞭如何只導入Complex模塊:

import Complex

另外,我們還可以按照這些寫法導入整個Numerics API:

import Numerics

Real模塊定義了三個協議:ElementaryFunctionsRealFunctionsReal,Cannon說,最後一個是其中最重要的。

Real描述了一個浮點類型,它提供了完整的數字函數集,比如explogcospow等等。其強大之處在於,藉助它,我們可以編寫通用的代碼,這些代碼能夠無縫地集成到Swift未來會添加的新浮點類型中,比如Float16Float128。上文提到的另外兩個協議用於分區(partition)函數,它們可以很容易地擴展至比實數更通用的數字字段,或者擴展至非實數字段。後者包括像exp2exp10gammalogGamma等衆多的函數。

Complex數字構建在Real之上:

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

藉助簡單直接的語法,我們可以針對複雜數字進行基本的計算操作:

import Complex// 聲明一個複雜數字:let z: Complex<Double> = 2 + 3 * .iprint(z)           // (2.0, 3.0)print(z.real)      // 2.0print(z.imaginary) // 3.0let w = Complex<Double>(1, -2.5)let zz = z + zzlet 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章