Std::expm1(z)表示复数z

std::expm1(z) for complex z?

本文关键字:表示 Std expm1      更新时间:2023-10-16

标准c++库仅为真正的x提供std::expm1(x)。对于复杂的z,是否有std::expm1(z)的实现?

不在标准库中,没有

可能值得建议在将来的版本中包含它

exp(a + i*b) - 1
= exp(a) * (cos(b) + j*sin(b)) - 1
= exp(a)*cos(b)-1 + j*exp(a)*sin(b)
= (exp(a)-1)*cos(b) + (cos(b)-1) + j*exp(a)*sin(b)
=   expm1(a)*cos(b) + (cos(b)-1) + j*exp(a)*sin(b)
                      ^^^^^^^^^^

唯一会有准确性问题的是突出显示的项(对于小b),因为我们将采用非常小的第一项,加上cos(b),这几乎是1(即相对巨大),然后减去1。一般来说,这样做会破坏第一项的准确性。

幸运的是,计算先驱已经遇到了这个问题,并给了我们一个解决方案,称为cosm1(..),它精确地实现了(cos(b)-1)对于小b。例如,下面是SciPy使用的C语言实现。我不能在<cmath>中看到它,所以它可能被认为太模糊了。