一个兄弟在厦大读研,经常问我一些c++方面的问题,前两周他遇到了double精度影响矩阵运算库eigen的问题,具体表现为直接赋值矩阵求逆和计算后赋值一样的值矩阵求逆结果差异很大。
矩阵数据
使用MATLAB数据直接输入
1.89722 7.0286 -10.3006
2.24151 -2.2824 4.89696
4.13873 4.7462 -5.40362
计算输入
(a1-b1)/c1 (a1-b1)/c1 (a1-b1)/c1
(a1-b1)/c1 (a1-b1)/c1 (a1-b1)/c1
(a1-b1)/c1 (a1-b1)/c1 (a1-b1)/c1
打印出计算后矩阵值
1.89722 7.0286 -10.3006
2.24151 -2.2824 4.89696
4.13873 4.7462 -5.40362
看起来和手动输入值一致,但计算结果不一样
原因,精度丢失
MATLAB输出的是约等于的值(应该也是c++开发的),因此和真实计算结果产生偏差,通过矩阵运算将差值放大
例子:
#include <iostream>
#include <iomanip>
using namespace std;
int main(int argc, char *argv[])
{
double h1=1.21212;//手动赋值
double h2=1.21212;//手动赋值
double c1=4.0/3.3;//手动赋值
cout << "手动赋值a:"<< h1 << "\t手动赋值b:" << h2 << endl;
cout << "计算赋值:"<< c1 << endl;
cout << "手动是否相等:"<< ((h2==h1)?"相等":"不等") << endl;
cout << "手动值和计算值是否相等:"<< ((c1==h1)?"相等":"不等") << endl;
cout << fixed << setprecision(16) << "手动" << h1 << "计算" << c1 << endl;
return 0;
}
输出
C:\Users\Administrator\Desktop\git>g++ test.cpp&& a.exe
手动赋值a:1.21212 手动赋值b:1.21212
计算赋值:1.21212
手动是否相等:相等
手动值和计算值是否相等:不等
手动1.2121200000000001计算1.2121212121212122
可以看出直接输入和计算出的是不一致的,自然不是同一个数,且double类型精度16,随着计算次数精度也不断损失,偏差越大