【发布时间】:2017-07-07 23:38:52
【问题描述】:
我在 C++ 中使用 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: " << a.determinant() << endl;
这部分代码打印
Matrix a:
0.8333333 1.166667 2.166667
1.166667 1.5 2.5
1.5 1.833333 2.833333
Determinat of matrix a is: -7.401487e-17
方法二:
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();
打印出来的
0.8333333 1.166667 2.166667
1.166667 1.5 2.5
1.5 1.833333 2.833333
Determinant of matrix b is: 2.333331e-07
方法 I 产生错误的结果,而方法 II 给出正确的答案。第一种情况出了什么问题? (我正在使用 Visual Studio。)提前致谢!
【问题讨论】:
-
手动尝试计算,我认为 0 是准确答案
-
您必须以全精度打印浮点数才能进行此类实验,在您的情况下:
cout << setprecision(17) << a << endl;,将输出复制粘贴到方法 II(或任何其他工具),然后您将获得相同(或相当接近)的决定因素。