对于复数,std :: exp给出的结果与MATLAB exp不同

时间:2014-04-30 15:50:29

标签: 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。

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

编辑:我手动尝试用eulers公式计算指数

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

并在c ++中获得相同的结果

1 个答案:

答案 0 :(得分:1)

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

如果包含标题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