随着 apple/swift-numerics 对 Swift 中复数的支持,Swift 对复数的支持终于 正式发布。您应该考虑使用 Numerics
的 ComplexModule
而不是本模块。我自己在任何可能的地方都切换到了 swift-numerics
。但是仍然有一些原因导致您可能想要使用本模块。
swift-numerics
100% 依赖于 Swift 包管理器。您无法在 Swift Playgrounds 上使用它。ComplexModule
可能过于 Swift 化。ComplexModule
采用了 无穷远点。虽然这在数学上更正确,但在技术上可能会导致意想不到的结果,因为复数上的实数运算不再与实数上的实数运算同构。例如,Complex(-1.0, 0.0) / Complex(0.0, 0.0)
是 Complex(+infinity, 0.0)
,而不是像许多其他平台那样的 Complex(-infinity, nan)
。Swift 和 Swift 包管理器中的复数。
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)
complex.swift 实现了 c++11 中的 std::complex 的所有功能,而且可以说是更加直观。
Complex<R>
,其中 R
是符合 ComplexElement
协议或 GaussianIntElement
协议的 .real
和 .imag
类型。+
、-
、*
、/
和 abs()
等基本算术运算之外,Complex<T:RealType>
还具有像 exp()
、log()
、sin()
、cos()
这样的 libm
函数。Double
和 Complex
有一个属性 .i
,它返回 self * Complex(0,1)
,而不是定义常量 i
,这样就不会污染标识符 i
,它太常用于迭代,无法使其成为常量。z.abs
表示 abs(z)
z.arg
表示 arg(z)
z.norm
表示 norm(z)
z.conj
表示 conj(z)
z.proj
表示 proj(z)
Complex(abs:magnitude, arg:argument)
$ git clone https://github.com/dankogai/swift-complex.git
$ cd swift-complex # the following assumes your $PWD is here
$ swift build
简单地
$ swift run --repl
或
$ scripts/run-repl.sh
或
$ swift build && swift -I.build/debug -L.build/debug -lComplex
并在您的 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 项目是故意从存储库中排除的,因为它应该通过 swift package generate-xcodeproj
生成。为方便起见,您可以
$ scripts/prep-xcode
然后工作区会打开,并在顶部显示 Playground。该 playground 被编写为手册。
不幸的是,Swift 包管理器不支持 iOS。更糟糕的是,Swift Playgrounds 不支持模块。
幸运的是,Playgrounds 允许您在 Sources
目录下包含 Swift 源代码。只需运行
$ scripts/ios-prep.sh
这样就完成了。iOS/Complex.playground
现在可以在 macOS 上的 Xcode 和 Playgrounds 以及 iOS 上的 Playgrounds 上运行(好吧,它应该是在 iPadOS 上,但仍然标记为 iOS)。
将以下内容添加到 dependencies
部分
.package(
url: "https://github.com/dankogai/swift-complex.git", from: "5.0.0"
)
并将以下内容添加到 .target
参数
.target(
name: "YourSwiftyPackage",
dependencies: ["Complex"])
现在您要做的就是
import Complex
在您的代码中。尽情享受吧!
Swift 5 或更高版本,OS X 或 Linux 用于构建。