2012-02-16 126 views
2

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

用于获得或多或少相同的输出I称为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 

犰狳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 

现在,我不知道,如果thoose有点不精确(0.039是附近0.041)在我的C++的一些错误引起的代码转换或它们应该被认为是G双精度之间的正常差异++和MATLAB

在我的代码我使用了很多周期是这样的:

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

其中xi_summedtransalphabarma::mat%是逐个元素的乘法和mat::t()被调换和规范的功能,使的条目米atrix A数组总和为1

+1

对我来说,这看起来不像正常的差异。 – WeaselFox 2012-02-16 12:56:07

+0

请给我们一些代码。 – 2012-02-16 12:59:11

+0

我想重写HMM工具包的一些功能,并且有超过500行C++代码。我不知道什么行后,因为我不知道错误应该在哪里 – nkint 2012-02-16 13:01:22

回答

3

这当然不是一个正常的区别!

机器epsilon的数量级要小于所得到的错误数(即2.22e-016 vs. 2.0e-3)。

可以确认你的机器小量用下面的C++代码:

#include <limits> 

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

您的MATLAB脚本将被绑定到相同的限制;可以通过输入确认此以下到Matlab命令窗口:

eps 

如果正在执行在Matlab和C++的计算是数学上等效,那么你应该获得同样的结果 - 尤其是4 D.P.精确!

2

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

但是,它也高度依赖于你正在做的微积分。例如,如果您计算两个非常大的数字的差异,并且差异非常小,那么您的精度将会非常差。

确实,eps是一个相对精度。 因此,如果您输入eps(n),您将具有给定值的精度。

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

+0

以及如何检查C++中的精度设置相同? – nkint 2012-02-16 13:04:39

+0

在C++中。双变量是64位,所以精度应该在'2^-64 = 5e-20'左右。同样,float应该有'2^-32 = 2e-10'精度 – Oli 2012-02-16 13:13:38

+0

所以如果我想让matlab具有相同的C++精度,我必须编写eps(5e-20)。 但我的不同结果呢?因为你是由不同的精度造成的,或者错误是在别的地方? – nkint 2012-02-16 13:16:40