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