梵洛何 2015-11-28 07:06 采纳率: 18.2%
浏览 1592

一元二次方程求解,解决溢出,要求精确度

乘法可能会溢出,所以要解决溢出,要求输出结果相对误差1e-12,这是我的代码,不知道哪里出了问题,结果总是不对。还是学生一枚,求大神指教

 #include<iostream>
#include<iomanip>
#include<cmath>
#include<float.h>
using namespace std;
int main()
{
    double a,b,c,con1=1e-12,con2=1e12,pan,x1,x2,temp;
    cin>>a>>b>>c;

    if(c==0)
    {
        if(b==0)
        {
            x1=0;
            x2=0;
        }
        else
        {
            x1=0;
            x2=-b/a;
        }
        cout<<x1<<endl;
        cout<<x2<<endl;
        return 0;
    }
    if(b==0)
    {
        if((a*c)>0)
        {
            x1=0;
            x2=0;
        }
        else
        {
            x1=sqrt(-c/a);
            x2=-x1;
        }
        cout<<setiosflags(ios::scientific)<<setprecision(16)<<x1<<endl;
        cout<<setiosflags(ios::scientific)<<setprecision(16)<<x2<<endl;
        return 0;
    }
    while(fabs(b)>DBL_MAX/fabs(b)||fabs(4*a)>DBL_MAX/fabs(c))
    {
        a=a*con1;
    b=b*con1;
    c=c*con1;
    }
    while(fabs(b)<DBL_MIN/fabs(b)||fabs(4*a)<DBL_MIN/fabs(c))
    {
        a=a*con2;
    b=b*con2;
    c=c*con2;
    }
    pan=b*b-4*a*c;
    if(pan<-(1e-12))//判别式小于0
    {
        cout<<0<<endl;
        cout<<0<<endl;
        return 0;
    }
    if(pan>=-(1e-12)&&pan<=(1e-12))//判别式等于0
    {
        x1=-b/(2*a);
        x2=-b/(2*a);
        cout<<setprecision(16)<<x1<<endl;
        cout<<setprecision(16)<<x2<<endl;
    }
    else{//判别式大于0

    temp=sqrt(b*b-4*a*c);
    if(b>0)
        {
    x1=(-b-temp)/(2*a);
    x2=(-b+temp)/(2*a);
        }
        else
        {
            x1=(2*c)/(-b-temp);
            x2=(2*c)/(-b+temp);
    }
        cout<<setprecision(16)<<x1<<endl;
        cout<<setprecision(16)<<x2<<endl;
    }

    return 0;
}


  • 写回答

4条回答 默认 最新

  • ysuwood 2015-11-28 07:20
    关注

    说说结果怎么不对了?

    评论

报告相同问题?

悬赏问题

  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探