c++ - std::exp 给出与复数的 MATLAB exp 不同的结果

标签 c++ matlab complex-numbers exp

我正在将脚本从 matlab 复制到 C++ 函数中。但是,对于 exp 函数,我不断得到不同的结果。例如,以下片段:

std::complex<double> final_b = std::exp(std::complex<double>(0, 1 * pi));

应该等同于MATLAB代码

final_b = exp(1i * pi);

但事实并非如此。对于 MATLAB,我收到 -1 + 0i(这是正确的),对于 C++,我收到 -1 + -2.068231e-013*i。

现在我一开始认为这只是某种舍入误差,但对于我使用的实际脚本,它具有更大的复指数,我得到完全不同的数字。这是什么原因?我该如何解决这个问题?

编辑:我已经手动尝试用欧拉公式计算指数

exp(x+iy) = exp(x) * (cos(y) + i*sin(y)) 

并在 C++ 中获得相同的不稳定结果

最佳答案

这称为浮点近似(或不精确):

如果包含 header cfloat,则有一些定义。特别是 DBL_EPSILON,它是 1.0 + DBL_EPSILON != 1.0 的最小数字,通常是 1e-9(和 -2.068231e-013 比它小很多。如果执行以下代码,您可以检查它是否为零:

// The complete formula is std::abs(a - b), but since b is zero, I am ommiting it
if (std::abs(number.imag()) < DBL_EPSILON) {
    // The number is either zero or very close to zero
}

例如,您可以在此处查看工作代码:http://ideone.com/2OzNZm

关于c++ - std::exp 给出与复数的 MATLAB exp 不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23392648/

相关文章:

r - Matlab 的 fminunc 函数的 R 等价物是什么?

python - 将复杂的 Matlab 引擎数组高效转换为 numpy ndarray

python - 如何使特征值和特征向量保持真实而不是复杂?

numpy - FFT实部/虚部/绝对部分解释

c++ - 如何确保(像最终尝试一样)销毁 HEAP-ALLOCATED 对象

c++ - (n*2-1)%p : avoiding the use of 64 bits when n and p are 32 bits

堆上的 C++ 数组

matlab - 匿名函数中的 If-then-else

java - 如何在 Complex 类中实现 square()、modulus Squared() 和 add() 方法?

c++ - 棘手的回调实现(C++)