写了一个用二分法求方程近似根的程序,但调试有错,高手帮忙看看.

来源:百度知道 编辑:UC知道 时间:2024/06/07 02:06:49
#include<stdio.h>
#include<math.h>
#define E 0.01
float f(float x)
{
float y;
y=x*x*x+2*x*x+2.3*x+1.4;
return(y);
}
float root(float x1,float x2)
{
float x,y,y1,d;
y1=f(x1);
do
{
x=(x1+x2)/2;
y=f(x);
if(y*y1>=0)
{
x1=x;
y1=y;
}
else
x2=x;
}while((abs(x-x1))>=E);
return(x);
}
void main()
{
float x1,x2,y1,y2,r;
printf("Please input 2 numbers:\n");
do
{
scanf("%f%f",&x1,&x2);
y1=f(x1);
y2=f(x2);
printf("f(x1)=%5.2f\tf(x2)=%5.2f\n",y1,y2);
if(y1*y2>=0)
printf("There is no root between %5.2f and %5.2f.Please input x1,x2 again.\n",x1,x2);
}while(y1*y2>=0);
r=root(x1,x2);
printf("A root of function is %5.2f\n",r);
getch();
}
我现在只知道错出在root函数中:

1.这个题目的数据类型应该用double

*** 用double可以提高输出精度。

2.应该用fabs()函数

*** abs()用于整型值,fabs()用于浮点值

3.E的值应该更小一些.

4.这个root函数用递归可能更好理解一些

修改后的程序如下:

//////////////////////////////////////

#include<stdio.h>
#include<math.h>
double E=1e-13;
double f(double x)
{
double y;
y=x*x*x+2*x*x+2.3*x+1.4;
return(y);
}

double root(double x1,double x2)
{
double x,y,y1,d;

do
{
y1=f(x1);
x=(x1+x2)/2.0;
y=f(x);
if(y*y1<0.0)
{
x2=x;
}
else if (y1==0.0) return (x);

else
{
x1=x;
}
}while(fabs(x2-x1)>E);
return(x);
}

void main()
{
double x1,x2,y1,y2,r;

do
{ printf("Please input 2 numbers:\n");
scanf("%lf%lf",&x1,&x2);
y1=f(x1);
y2=f(x2);
printf("f(x1)=%5.2f\tf(x2)=%5.2f\n