Complex is an elegant and efficient complex number datatype for Swift.
First of all, the library defines a global variable 𝒊, which is the imaginary unit.
// note that "𝒊" is an unicode char, not the acsii "i"
print(𝒊) // prints 1.0𝒊
// satisfies the equation:
print(𝒊 ^ 2 == -1) // prints trueWith imaginary unit 𝒊, you can do complex number in Swift like magic:
let c1 = 3 + 2 * 𝒊 // 3 + 2𝒊
let c2 = 1 - 4 * 𝒊 // 1 - 4𝒊
print(c1 * c2 - (2 - 4 * 𝒊)) // prints 9.0-6.0𝒊Copy Complex.swift and ComplexOperator.swift (optional) to your project. And done.
You can try ComplexNumber.playground in Xcode. The source files are located in ComplexNumber.playground/Sources/ folder.
Complex is a Swift struct which presents complex number in math. Basically the definition is going like this:
struct Complex {
var real: Double
var imaginary: Double
}Very simple and straight foward. Good.
Use constructor:
let c = Complex(1, -4) // 1 - 4𝒊Or, do the same thing with imaginary unit 𝒊:
let c = 1 - 4 * 𝒊 // 1 - 4𝒊Behind the scene, the definition of 𝒊 just is:
public let 𝒊 = Complex(0, 1)// use property
c.real
c.imaginary
// or use subscript
c[0] // same with "c.real"
c[1] // same with "c.imaginary"Complex supports +, -, *, /, and ^ operations with both Complex and pure real number (Double).
// assume we have four complex numbers...
var c1: Complex, c2: Complex, c3: Complex, c4: Complex
// then you can do
let result = (c1 + c2 ^ 2) * (c3 - 1) / c4If you do not use custom operators, you can just use methods instead:
let result = c1.add(c2.power(2)).multiply(c3.subtract(1)).divide(c4)There are also mutating operators and methods:
c1 += c2 // c1 is modified
c1.addInPlace(c2) // c1 is modifiedIn polar form, we use r and φ to presents a complex number, where r is absolute value (or radius) and φ is argument.
let c1 = 3 + 4 * 𝒊
// radius and argument are predefined properties
let r = c1.radius
let φ = c1.argThen you can present a complex number in polar form:
let c2 = r * (cos(φ) + sin(φ) * 𝒊) // c2 is 3 + 4𝒊, same with c1We also support angle notation with ∠ operator:
let c3 = r ∠ φ // c3 is 3 + 4𝒊 either, same with c1 and c2The implementation of Complex is straight forward. Therefore, the performance and accuracy are determined by Double datatype, which is used to implement Complex.
Double is preferred in Swift. So Complex is implemented with Double by default.
However, if you are working with GPU, you may want to use Float instead Double, despite it is 32-bit and has lower accuracy. To do this, just replace all "Double" with "Float" in source files, then you have a float-version Complex.