一元三次方程 double输出 -0.00
2024-09-03 10:18:43
求一个 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+;
typedef long long ll;
const double eps=1e-;
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)/;
if(cal(mid)<) 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)/;
if(cal(mid)>) l=mid;//!!!
else r=mid;
}
return l;//print l not r
}
int main(){
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
double a1=*a,b1=*b,c1=c;
double x1=(-b1+sqrt(b1*b1-*a1*c1))/(*a1);
double x2=(-b1-sqrt(b1*b1-*a1*c1))/(*a1);
if(x1>x2) swap(x1,x2);
double ans1=-,ans2=,ans3=;
if(a>) ans1=ok1(-,x1),ans2=ok2(x1,x2),ans3=ok1(x2,);
else ans1=ok2(-,x1),ans2=ok1(x1,x2),ans3=ok2(x2,);
printf("%.2f %.2f %.2f\n",ans1,ans2,ans3);
return ;
}
//1.000000 134.810000 4749.016919 49980.676731
//-0.715 -0.71 if(fabs(x-)<eps) x=;
最新文章
- .NET 提升教育 第一期:VIP 付费课程培训通知!
- 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)
- Git从入门到学会
- Jquery实现一组复选框单选
- 在WPF中使用文件夹选择对话框
- 用Lucene检索数据库
- 【Android自学之旅】 Android开发环境的搭建
- [课程相关]homework-03
- Fixflow引擎解析(五)(内核) - 基于Token驱动的引擎内核运转原理
- HTML新元素
- webex录屏
- VS2008下编译BOOST 1.39的ASIO库
- 用ES6创建一个简单工厂模式
- Rest和Restful &; http
- topcoder srm 305 div1
- js正则、js全选、反选、全不选、ajax批删
- jquery模型(外壳实现)
- Codeforces Beta Round#2
- part1:8-远程登录Linux
- js 判断图片是否加载完成