AHUOJ 二分法求方程的根

4 篇文章 0 订阅
3 篇文章 0 订阅

问题描述
用二分法求方程f(x)=ax4+bx3+cx2+dx+e=0 在 (x1,x2) 之内的根 本题保证f(x1)*f(x2)<=0且(x1,x2)内只有一个根。
输出描述:
一个浮点数,代表根,精确到小数点后10位。

解题思路:
过程没什么好说的的,主要是这个浮点数精度问题。

浮点数的比较:

  1. 等于运算符 (==)
    取一个极小值eps,使得满足一定精度的两个浮点数可以认为相等。用科学计数法表示1e-n
const double eps = 1e-11
#define Equ(a, b) ((fabs((a) - (b))) < (eps))
  1. 大于运算符
#define More(a, b) ((a) - (b)) > (eps)
  1. 小于运算符
#define Less(a, b) ((a) - (b)) < (-eps)
  1. 大于等于运算符 (>=)
#define MoreEqu(a, b) ((a) - (b)) > (-eps)
  1. 小于等于运算符 (<=)
#define LessEqu(a, b) ((a) - (b)) < (pes)
  1. 圆周率
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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值