Segundo o engenheiro da Apple, Steve Cannon, o Swift Numerics é uma biblioteca open source nova para o Swift is a new open-source que tenta preencher uma lacuna na Swift Standard Library. Atualmente, a mesma inclui dois módulos, para computação matemática real e complexa, com mais por vir no roadmap.
A decisão atual de manter o Swift Numerics em seu próprio pacote ao invés de incluí-lo dentro da Standard Library é motivada principalmente por algumas limitações no compilador que impedem que novas APIs sejam implementadas de uma maneira que preserve a premissa de estabilidade do código fonte entre as versões da linguagem. No entanto, isso não descarta que partes do Swift Numerics possam fazer a transição para a Standard Library no futuro. Isso sem dizer que somente funcionalidades genéricas o suficiente serão consideradas para inclusão.
O Swift Numerics é uma biblioteca modular, o que significa que é possível somente importar o módulo desejado. Por exemplo, é assim que se importa o módulo Complex
:
import Complex
Alternativamente, é possível importar toda a API Numerics escrevendo:
import Numerics
O módulo Real
define três protocolos: ElementaryFunctions
, RealFunctions
, e Real
, que é o mais relevante dos três, segundo Cannon.
O Real descreve um tipo de ponto flutuante que fornece um conjunto de funções numéricas, tais como exp
, log
, cos
, pow
, etc. Seu poder vem da possibilidade de escrever código genérico que se adaptará perfeitamente a qualquer novo tipo de ponto flutuante que o Swift possa adicionar no futuro, tais como Float16
or Float128
. Os outros dois protocolos mencionados acima são usados para particionar funções que são fáceis de estender para campos numéricos mais gerais que números reais e aqueles que não são. O último grupo inclui funções como exp2
e exp10
, gamma
, logGamma
, e vários outros.
Complex
são construídos no topo do Real
:
public struct Complex<RealType> where RealType: Real {
...
}
É possível realizar as operações de cálculo mais básicos em números complexos usando a sintaxe:
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)
De acordo com Cannon, o Swift Numerics fornece grande performance em comparação com o C. Isso se deve basicamente à simplificação na manipulação dos zeros e NaNs. Enquanto o C (e C++) tende em distinguir diferente tipos de zeros e NaNs, o Swift Numerics opta por perder um pouco da informação em favor da simplificação do código, o que reduz a sobrecarga do programador para manter as coisas seguras e corretas e gera uma aceleração significativa.
Como última nota, o Swift Numerics contínua em ativo desenvolvimento e mais tipos serão adicionados no futuro, incluindo o Float16, inteiros de tamanho fixo maiores que 64 bits, o ShapedArray protocol para representar dados homogêneos multidimensionais, e outros.