一元三次方程 double输出 -0.00

求一个 a*x*x*x+b*x*x+c*x+d 的解

 

题目很简单,但是我输出了-0.00,然后就一直卡着,这个问题以后要注意。

 

让0.00 编程-0.00的方法有很多。

第一种就是直接特判

if(fabs(x-0)<eps) x=0;

  

第二种就是+eps,但是这样可能会有问题

 

第三种就是二分的时候让答案往正的输出(这个是针对我这个题目的)

 

我觉得第三种比较靠谱,所以就写了第三个

然后就是让这个eps的精度变高一点,这样的话,浮点误差就比较小。

 

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
#include <stack>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=2e4+10;
typedef long long ll;
const double eps=1e-6;
double a,b,c,d;
double cal(double x){
    return a*x*x*x+b*x*x+c*x+d;
}
double ok1(double l,double r){
    while(r-l>eps){
        double mid=(l+r)/2;
        if(cal(mid)<0) l=mid;//!!!
        else r=mid; 
    }
    return r;//print r   not l  
}
double ok2(double l,double r){
    while(r-l>eps){
        double mid=(l+r)/2;
        if(cal(mid)>0) l=mid;//!!!
        else r=mid; 
    }
    return l;//print l not r 
}
int main(){
    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    double a1=3*a,b1=2*b,c1=c;
    double x1=(-b1+sqrt(b1*b1-4*a1*c1))/(2*a1);
    double x2=(-b1-sqrt(b1*b1-4*a1*c1))/(2*a1);
    if(x1>x2) swap(x1,x2);
    double ans1=-1,ans2=0,ans3=0;
    if(a>0) ans1=ok1(-100,x1),ans2=ok2(x1,x2),ans3=ok1(x2,100);
    else ans1=ok2(-100,x1),ans2=ok1(x1,x2),ans3=ok2(x2,100);
    printf("%.2f %.2f %.2f\n",ans1,ans2,ans3);
    return 0;
}
//1.000000 134.810000 4749.016919 49980.676731
//-0.715  -0.71

if(fabs(x-0)<eps) x=0;
posted @ 2020-01-02 20:29  EchoZQN  阅读(303)  评论(0编辑  收藏  举报