c++ 关于double类型精度问题

一个兄弟在厦大读研,经常问我一些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,随着计算次数精度也不断损失,偏差越大

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值