请各位看看一下用牛顿迭代法求解方程的程序

来源:百度知道 编辑:UC知道 时间:2024/06/14 18:30:30
#include "stdio.h"
main()
{ float a,b,c,d,x,f,f1;
scanf("%f,%f,%f,%f",&a,&b,&c,&d);
scanf("%f",&x);
for(;;x=x-f/f1)
{
f=a*x*x*x+b*x*x+c*x+d;
f1=3*a*x*x+2*b*x+c;
if(f==0)break;
}
printf("r=%f",x);
getch();
}
老师说这个程序的原理是错的,我怎么也搞不懂,问他错在哪,他也说不出来。很是郁闷!所以路过的朋友一定要帮一下呀。

你的程序逻辑上的确没什么问题,问题出在一个很隐蔽且很容易忽略的地方:
由于浮点数在内存中存储时会有舍入误差,所以用一个浮点变量与任何确定的常量值进行相等比较都是存在隐患的!切忌这样的应用!!正确的比较方式应为比较一个浮点值与一个数的差的绝对值小于某个足够小的数.
我把你的程序做了一些修改,你再看一下:
#include "stdio.h"
#include "math.h"

main()
{
double a,b,c,d,x,f,f1;
/*强烈建议使用精度更高的double型变量,在很多编译器的实现中,这种类型的效率甚至比float更高!而且更不容易出错*/
scanf("%lf,%lf,%lf,%lf",&a,&b,&c,&d); /*这里没问题,输入格式完全可以是以逗号分隔*/
scanf("%lf",&x);
for(;;x=x-f/f1)
{
f=a*x*x*x+b*x*x+c*x+d;
f1=3*a*x*x+2*b*x+c;
if(fabs (f-0)<1e-6)/*判断f的值是否足够接近0*/
break;
}
printf("r=%lf\n",x);
getch ();
return 0;
}

逻辑上应该没错
#include "stdio.h"
main()
{ float a,b,c,d,x,f,f1;
scanf("%f%f%f%f",&a,&b,&c,&d); //注意:scanf输入时没有逗号。
scanf("%f",&x);
for(;;x=x-f/f1) //这里f和f1都没被赋值
{
f=a*x*x*x+b*x*x+c*x+d;
f1=3*a*x*x+2*b*x+c;