matlab和c ++精度

时间:2012-02-16 12:52:47

标签: c++ matlab double-precision

您好我正在使用armadillo库将一个脚本从MATLAB重写为C ++,用于线性代数和矩阵。

获得或多或少相同的输出我称为cout方法:

cout.precision(4);
cout.setf(ios::fixed);

但是我得到了不同的结果:

Matlab结果:

0.0000    0.0000    0.0000    0.0000    0.0000   
0.0012    0.0014    0.0016    0.0020    0.0281  
0.0396    0.0297    0.0297    0.0495    0.0976  

Armadillo c ++结果:

0.0000    0.0000    0.0000    0.0000    0.0000 
0.0012    0.0014    0.0016    0.0020    0.0282 
0.0416    0.0312    0.0312    0.0520    0.1027

现在,我不知道在我的C ++代码翻译中是否有一些错误引起了一点点不精确(0.039接近0.041),或者它们应被视为双精度之间的正常差异g ++和MATLAB

在我的代码中,我使用了很多这样的循环:

xi_summed = xi_summed + normalise((trans % (alpha.col(t) * b.t())));

其中xi_summedtransalphabarma::mat%为逐元素乘法,{{1} transpose和normalize是一个函数,它使矩阵mat::t()数组的条目总和为A

2 个答案:

答案 0 :(得分:3)

这肯定不是正常的差异!

机器epsilon将比你得到的误差小几个数量级(即2.22e-016 vs. 2.0e-3)。

您可以使用以下C ++代码确认您的机器epsilon:

#include <limits>

cout << "Machine Epsilon is: " << numeric_limits<double>::epsilon() << endl;

您的Matlab脚本将受到相同的限制;您可以通过在Matlab命令窗口中输入以下内容来确认:

eps

如果您在Matlab和C ++中执行的计算在数学上是等效的,那么您应该获得相同的结果 - ,尤其是4 d.p.精度!

答案 1 :(得分:2)

通常精度要好得多,你可以通过输入eps来找出matlab的精度。对我而言,2.2204e-16

然而,它也很大程度上取决于你正在做的微积分。

例如,如果计算两个非常大的数字的差异,并且差异非常小,那么您的精确度将非常差。

确实,eps是相对精确度。 因此,如果您键入eps(n),您将获得给定值的精度。

例如,eps(10^16)2。因此,对于数字大小为10^16的操作,精度将为2