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

乘法可能会溢出,所以要解决溢出,要求输出结果相对误差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;
}


说说结果怎么不对了?

判断实数是否等于0,一般这样判断:

 fabs(a)<0.0001
 不是 a==0

判别式等于0的那个IF改成else if试试

判断实数是否等于0,一般这样判断:

fabs(a)<0.0001
不是 a==0