问题描述
用二分法求方程f(x)=ax4+bx3+cx2+dx+e=0 在 (x1,x2) 之内的根 本题保证f(x1)*f(x2)<=0且(x1,x2)内只有一个根。
输出描述:
一个浮点数,代表根,精确到小数点后10位。
解题思路:
过程没什么好说的的,主要是这个浮点数精度问题。
浮点数的比较:
- 等于运算符 (==)
取一个极小值eps,使得满足一定精度的两个浮点数可以认为相等。用科学计数法表示1e-n
const double eps = 1e-11
#define Equ(a, b) ((fabs((a) - (b))) < (eps))
- 大于运算符
#define More(a, b) ((a) - (b)) > (eps)
- 小于运算符
#define Less(a, b) ((a) - (b)) < (-eps)
- 大于等于运算符 (>=)
#define MoreEqu(a, b) ((a) - (b)) > (-eps)
- 小于等于运算符 (<=)
#define LessEqu(a, b) ((a) - (b)) < (pes)
- 圆周率
const double Pi = acos(-1.0);
代码如下:
#include <stdio.h>
#include <math.h>
/*
两个测试点没有通过
abs()返回值是int
fabs()才是double
指数可以用科学计数法表示,1e-x
*/
double func(double x);
int a,b,c,d,e;
int main()
{
double x1,x2;
double mid;
double f;
scanf("%d%d%d%d%d%lf%lf",&a,&b,&c,&d,&e,&x1,&x2);
do
{
mid = (x1 + x2) / 2.0;
f = func(mid);
//这里用的等于的形式
if(fabs(f) < 1e-11)
{
break;
}
else if(func(x1) * f <= 0)
{
x2 = mid;
}
else
{
x1 = mid;
}
}while(1);
printf("%.10f\n",mid);
return 0;
}
double func(double x)
{
return a * pow(x,4) + b * pow(x,3) + c * pow(x,2) + d * x + e;
}