首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C++代码编程的一个小插曲

C++代码编程的一个小插曲

作者头像
用户9925864
发布2022-07-27 09:42:37
发布2022-07-27 09:42:37
4340
举报

入职新公司,把大一扔下的C++要重新捡起来,今天在学习的时候遇到一个C++实现二分法求解方程根的问题,顺便记录下

题目要求比较简单,就是用二分法求解一个方程组在特定范围的根,要求误差小于0.00001.

方程组为:x^9-4*x^5-5*x^3-270000=0,范围为0~10;

C++代码方式:

代码语言:javascript
复制
#include <iostream>
#include "math.h"
#include <iomanip>
using namespace std;
using std::cin;
using std::cout;
using std::endl;

int main() {
    double x;
    double x1(0),x2(10),y0, y1;
    double tol;
    do{
        x = (x1+x2)/2;
        tol = pow(x,9)-4*pow(x,5)-5*pow(x,3)-270000;
        cout<<tol<<endl;
        y0 = pow(x1,9)-4*pow(x1,5)-5*pow(x1,3)-270000;

        y1 = pow(x2,9)-4*pow(x2,5)-5*pow(x2,3)-270000;
        cout<<tol<<" " <<y0<<" " <<y1<<" " <<endl;
        if (tol*y0<0){
            x2 = x;
        } else{
            x1 = x;
        }
        if (x1==x2){
            break;
        }
        cout<<x1<<", " <<x2<<" " <<endl;
    } while (fabs(tol)>0.00001);
    cout<<x<<endl;
    return 0;
}

cout是我调试用的,便于实时看看结果

输出结果可以看到为4.02057

为了验证我的结果是否正确,我在用matlab自带的fsolve函数来求解一遍

代码语言:javascript
复制
>> x = fzero("x^9-4*x^5-5*x^3-270000",2);
>> x

x =

    4.0206
 >> x^9-4*x^5-5*x^3-270000

ans =

  -5.8208e-11

和我的结果很接近,而且这个误差符合要求,但我把C++的计算结果4.02057带入方程组去计算,发现这个误差值为1.897,和预计的相差较大,

代码语言:javascript
复制
>> x = 4.02057

x =

    4.0206

>> x^9-4*x^5-5*x^3-270000

ans =

    1.8973

仔细查看了一下C++的cout过程,可以发现C++计算的tol是符合要求的,小于0.00001,那最大的可能性就是显示的问题了,查阅资料得到:

cout输出时,默认double只能显示6位有效数字

为了得到准确的时候需要增加cout的输出位数

代码语言:javascript
复制
#include <iostream>
#include "math.h"
#include <iomanip>
using namespace std;
using std::cin;
using std::cout;
using std::endl;

int main() {
    double x;
    double x1(0),x2(10),y0, y1;
    double tol;
    do{
        x = (x1+x2)/2;
        tol = pow(x,9)-4*pow(x,5)-5*pow(x,3)-270000;
        cout<<tol<<endl;
        y0 = pow(x1,9)-4*pow(x1,5)-5*pow(x1,3)-270000;

        y1 = pow(x2,9)-4*pow(x2,5)-5*pow(x2,3)-270000;
        cout<<tol<<" " <<y0<<" " <<y1<<" " <<endl;
        if (tol*y0<0){
            x2 = x;
        } else{
            x1 = x;
        }
        if (x1==x2){
            break;
        }
        cout<<x1<<", " <<x2<<" " <<endl;
    } while (fabs(tol)>0.00001);
    cout<<setprecision(13) <<x<<endl;
    return 0;
}

此时的x为:4.020566884828,在matlab中计算一下

代码语言:javascript
复制
>> x = 4.020566884828

x =

    4.0206

>> x^9-4*x^5-5*x^3-270000

ans =

   1.7846e-07

同样的,matlab也有这个显示的问题,在高精度的计算中,还是不能简单的看这个表面的输出数据,还需要注意其对应的精度问题!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法工程师的学习日志 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • cout输出时,默认double只能显示6位有效数字
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档