Swift中的复数?

7

苹果的Swift语言原生支持复数吗?

我在文档中找不到任何有关C++std::complex等价物的提及,也无法在尝试时找到任何一个。


你能在 complex.h 中进行桥接吗? - William Entriken
3个回答

17

我写了以下内容:

https://github.com/dankogai/swift-complex

只需将complex.swift添加到您的项目中,您就可以像这样进行操作:

let z = 1-1.i

它具有C++11涵盖的所有函数和运算符。

与C++11不同,complex.swift不是泛型--z.real和z.imag始终为Double。

但是,复数整数的必要性非常模糊,我认为应该将其视为不同的类型(也许是GaussianInteger)。


1
是的,语法非常优雅。我喜欢“1.i”。然而,在大多数现实应用中,它们可能会在更加计算密集的环境中使用。因此,性能可能是一个重要问题。 - kawingkelvin

2
不可以。你可以通过使用import Accelerate来导入Accelerate模块并使用DSPComplex类型。更多详细信息请参阅文档

我的Accelerate经验仅限于几行测试和观看WWDC视频。我尝试将i转换为-i作为热身,发现在Swift中需要大量的样板代码来处理这个问题,例如将一种“类型”转换/桥接到另一种“类型”,以便与C进行互操作。大多数API实际上都使用向量。因此,如果您手头没有矢量化问题,我想知道开销是否值得麻烦,而dankogai的漂亮结构体和整数扩展甚至可能更具性能。 - kawingkelvin
笔误: "integer extension" 应为 "Double extension"。 - kawingkelvin

2
苹果的Swift Numerics软件包支持复数。它于2019年11月7日首次发布。该软件包在2021年8月31日发布了1.0.0版,变得更加稳定。
以下是最初发布公告中的一些示例:
import Complex

let z: Complex<Double> = 2 + 3 * .i
print(z.real)      // 2.0
print(z.imaginary) // 3.0

let w = Complex<Double>(1, -2) // (1.0, -2.0)

let u: Complex<Double> = .i * .i // (-1.0, 0.0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接