dankogai/swift-complex
Complex numbers in Swift
Synopsis
import Complex
let z0 = 1.0 + 1.0.i // (1.0+1.0.i)
let z1 = 1.0 - 1.0.i // (1.0-1.0.i)
z0.conj // (1.0-1.0.i)
z0.i // (-1.0+1.0.i)
z0.norm // 2
z0 + z1 // (2.0+0.0.i)
z0 - z1 // (0.0+2.0.i)
z0 * z1 // (2.0+0.0.i)
z0 / z1 // (0.0+1.0.i)Description
complex.swift implements all the functionality of [std::complex in c++11], arguably more intuitively.
[std::complex in c++11]: http://www.cplusplus.com/reference/complex/
like C++11
- Protocol-Oriented * Complex numbers are
Complex<R>whereRis a type of.realand.imagthat conforms to theComplexElementprotocol orGaussianIntElementprotocol.
In addition to basic arithmetic operations like +, -, , / and abs(), Complex<T:RealType> gets libm functions like exp(), log(), sin(), cos().
unlike C++11
- Instead of defining the constant
i,DoubleandComplexhave a property.iwhich returnsself * Complex(0,1)so it does not pollute the identifieri, too popularly used for iteration to make it a constant. - Following functions are provided as compouted properties:
z.abs for abs(z) z.arg for arg(z) z.norm for norm(z) z.conj for conj(z) * z.proj for proj(z)
- Construct a complex number via polar notation as:
* Complex(abs:magnitude, arg:argument)
Usage
build
$ git clone https://github.com/dankogai/swift-complex.git
$ cd swift-complex # the following assumes your $PWD is here
$ swift buildREPL
Simply
$ swift run --replor
$ scripts/run-repl.shor
$ swift build && swift -I.build/debug -L.build/debug -lComplex
and in your repl,
Welcome to Apple Swift version 4.2 (swiftlang-1000.11.37.1 clang-1000.11.45.1). Type :help for assistance.
1> import Complex
2> Complex.sqrt(1.i)
$R0: Complex.Complex<Double> = {
real = 0.70710678118654757
imag = 0.70710678118654757
}Xcode
Xcode project is deliberately excluded from the repository because it should be generated via swift package generate-xcodeproj . For convenience, you can
$ scripts/prep-xcodeAnd the Workspace opens up for you with Playground on top. The playground is written as a manual.
iOS and Swift Playground
Unfortunately Swift Package Manager does not support iOS. To make matters worse Swift Playgrounds does not support modules.
Fortunately Playgrounds allow you to include swift source codes under Sources directory. Just run:
$ scripts/ios-prep.shand you are all set. iOS/Complex.playground now runs on Xcode and Playgrounds on macOS, and Playgrounds on iOS (Well, it is supposed to iPadOS but it is still labeled iOS).
From Your SwiftPM-Managed Projects
Add the following to the dependencies section:
.package(
url: "https://github.com/dankogai/swift-complex.git", from: "5.0.0"
)and the following to the .target argument:
.target(
name: "YourSwiftyPackage",
dependencies: ["Complex"])Now all you have to do is:
import Complexin your code. Enjoy!
Prerequisite
Swift 5 or better, OS X or Linux to build.
Package Metadata
Repository: dankogai/swift-complex
Stars: 68
Forks: 7
Open issues: 0
Default branch: main
Primary language: swift
License: MIT
Topics: complex-numbers, generics, math, swift
README: README.md