逗号初始化和构造函数C++;和本征 我在C++中使用了特征库,我正在寻找矩阵的行列式。根据我初始化矩阵的方式,我得到了不同的结果

逗号初始化和构造函数C++;和本征 我在C++中使用了特征库,我正在寻找矩阵的行列式。根据我初始化矩阵的方式,我得到了不同的结果,c++,matrix,eigen,C++,Matrix,Eigen,方法一: MatrixXd a(3, 3); for (int n = 0; n < 3; n++) for (int m = 0; m < 3; m++) a(n,m) = (double) (n + m*m + 2.5)/3; cout << "Matrix a: " << endl; cout << a << endl; cout << "Determinat of matrix a is:

方法一:

MatrixXd a(3, 3);
for (int n = 0; n < 3; n++)
    for (int m = 0; m < 3; m++)
        a(n,m) = (double) (n + m*m + 2.5)/3;

cout << "Matrix a: " << endl;
cout << a << endl;
cout << "Determinat of matrix a is: " << a.determinant() << endl;
MatrixXd b(3, 3);
b << 0.8333333, 1.166667, 2.166667,
    1.166667, 1.5, 2.5,
    1.5, 1.833333, 2.833333;

cout << b;
cout << endl << "Determinant of matrix b is: " << b.determinant();
方法二:

MatrixXd a(3, 3);
for (int n = 0; n < 3; n++)
    for (int m = 0; m < 3; m++)
        a(n,m) = (double) (n + m*m + 2.5)/3;

cout << "Matrix a: " << endl;
cout << a << endl;
cout << "Determinat of matrix a is: " << a.determinant() << endl;
MatrixXd b(3, 3);
b << 0.8333333, 1.166667, 2.166667,
    1.166667, 1.5, 2.5,
    1.5, 1.833333, 2.833333;

cout << b;
cout << endl << "Determinant of matrix b is: " << b.determinant();

方法I产生错误的结果,而方法II给出正确的答案。第一个案例出了什么问题?(我正在使用Visual Studio。)提前感谢

您在这里观察到的是计算中的舍入误差。让我这样解释:

对于计算机来说,一切都是基于二进制的,也就是说,与我们日常生活中常用的以10为基数不同,计算机是以2为基数计算的,也就是说,只有数字0和1

这不仅适用于整数,也适用于实数,如0.83333。。。 但是就像不可能写出0.83333的所有数字一样,你的计算机也不能存储这个数字的二进制表示的最后一个数字,因此它必须以某种方式对结果进行四舍五入

根据您初始化它的方式(通过计算
(n+m*m+2.5)/3
或通过从逗号初始化中读取值),最后一位数字中的结果可能会略有不同,从而导致不同的结果

您可以通过将0.8333333与2.5/3进行比较来尝试,这可能会返回
false
。如果你打印这些数字,你会得到同样的结果,但是内部的表现形式却有轻微的不同

然而,您应该注意到绝对误差本身非常小(小于0.000001),所以您现在不需要担心它。
如果您想要精确的结果,那么切换到能够精确表示这些值的有理数类型可能会有所帮助。

尝试手动计算,我认为0是精确的答案您必须以全精度打印浮点数,以便进行此类实验,在您的情况下:
cout