精度问题---一元三次方程求解

解法一:

#include<iostream>
#include<string>
#include<cstdio>
#include<string.h>
#include<cmath>
using namespace std;
double a,b,c,d;
//方法一:直接法
int main()
{
    cin>>a>>b>>c>>d;
    for(double x=-100;x<=100;x+=0.01)
    {
        if(abs(a*x*x*x+b*x*x+c*x+d)<=0.0001)
        {
           printf("%.2lf ",x);
        }
    }
    return 0;
}

解法二:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double a,b,c,d;
//方法二:直接法
double f(double x)
{
    return a*x*x*x+b*x*x+c*x+d;
 }
int main()
{
    cin>>a>>b>>c>>d;
    for(double x=-100;x<=100;x+=0.01)
    {   //x---x+0.01
        if(f(x)*f(x+0.005)<0)//x--x+0.005
        {
            printf("%.2lf ",x);
        }
        else if(f(x+0.01)*f(x+0.005)<0)//x+0.005---x+0.01
        {
            printf("%.2lf ",x+0.01);
        }
    }
    return 0;
}

解法三:二分法

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double a,b,c,d;
//方法二:直接法
double f(double x)
{
    return a*x*x*x+b*x*x+c*x+d;
 }
void solve(double l,double r){
    double mid,ans=0;
    while(r-l>=0.001)
    {
        mid=(l+r)/2;
        if(f(mid)==0)
           ans=mid;
        if(f(l)==0)
           ans=l;
        if(f(r)==0)
           ans=r;
        if(f(mid)==0)
            break;
        else if(f(mid)*f(r)>0)
            r=mid;
        else if(f(mid)*f(r)<0)
            l=mid;
    }
    printf("%.2f ", mid);
}
int main()
{
    cin>>a>>b>>c>>d;
    for(double x=-100;x<=100;x++)
    {
        if(f(x)==0)
            printf("%.2lf ",x);
        else if(f(x)*f(x+1)<0)
            solve(x,x+1);
    }
    return 0;
}
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double a,b,c,d;
//方法二:直接法
double f(double x)
{
    return a*x*x*x+b*x*x+c*x+d;
 }
void solve(double l,double r){
    double mid,ans=0;
    while(r-l>=0.001)
    {
        mid=(l+r)/2;
        if(f(mid)==0)
           ans=mid;
        if(f(l)==0)
           ans=l;
        if(f(r)==0)
           ans=r;
        if(f(mid)==0)
            break;
        else if(f(mid)*f(r)>0)
            r=mid;
        else if(f(mid)*f(r)<0)
            l=mid;
    }
    printf("%.2f ", mid);
}
int main()
{
    cin>>a>>b>>c>>d;
    for(double x=-100;x<=100;x++)
    {
        if(f(x)==0)
            printf("%.2lf ",x);
        else if(f(x)*f(x+1)<0)
            solve(x,x+1);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Aiahtwo/p/11084147.html