有效地将络合物转化为其极性形式

Efficiently converting complex to its polar form

std::complex c 转换为其极坐标形式很容易:

magnitude = abs(c)
phase = arg(c)

但是,这是获取幅度和相位的两个独立操作。如果标准库提供单一方法将 std::complex 转换为其极坐标形式,则算法或实现中的优化可能是可能的。

标准库是否提供了一种更有效的方法来将笛卡尔复形转换为其极坐标形式?我只找到了相反的 polar 方法。

据我所知,标准库没有提供以极坐标形式保存复数的对象。如果您想要此功能,则必须自己实现 class 或寻找第三方库来实现。

如果工作的任何部分实际上可以在这两个结果的计算中共享,我会感到相当惊讶。请注意,不仅使用不同的函数,而且甚至使用不同的方法来计算幅度和相位。这与同时计算正弦和余弦等计算情况有很大不同,在这种情况下,同时获得两个结果并将它们分开实际上并不比只获得一个或另一个更难。

形式z = r e^(iφ)不处理rφ以任何一种对称的方式,不给出任何理由相信它的逆应该。实际上要求 r ≥ 0 是相当随意的开始;与角度的模糊性不同,角度的模糊性被定义为 2π 的整数倍,这不是分支选择的结果,而仅仅是几何直觉的结果。简而言之,极坐标形式在数学上并不是很有趣。

如果您对 s = log r 而不是 r[=38= 感到满意,情况就会完全不同], 因为 z = e^(s + iφ) 和 s + iφ = log z。因此 "just" 对复数进行泛化对数就可以了,您的两个答案存储在结果的实部和虚部中。 std::log 扩展为 <complex>.

中的复数

尝试一些基准测试。 log + real + imag + exp 可能比 abs + arg 更快(使用优化)。