std::expm1(z) 表示复数 z?
std::expm1(z) for complex z?
标准 C++ 库提供 std::expm1(x)
仅用于真正的 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(..)
的解决方案,它为小型 b
准确地实现了 (cos(b)-1)
。例如,here is an implementation in C that SciPy uses. I can't see it in <cmath>
,所以它可能被认为太晦涩了。
标准 C++ 库提供 std::expm1(x)
仅用于真正的 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(..)
的解决方案,它为小型 b
准确地实现了 (cos(b)-1)
。例如,here is an implementation in C that SciPy uses. I can't see it in <cmath>
,所以它可能被认为太晦涩了。