0.00000000001)\x05{\x05\x05temp=f1;\x05\x05dx*=0.1;\x05\x05f1=(f(x+dx)-f(x))/dx;\x05\x05}\x05printf("%.16lf\n",f1);}" /> 0.00000000001)\x05{\x05\x05temp=f1;\x05\x05dx*=0.1;\x05\x05f1=(f(x+dx)-f(x))/dx;\x05\x05}\x05printf("%.16lf\n",f1);} - 作业答案大全" />

这个求导数的程序出现了逻辑错误?这个程序求函数x^2+x的导数.输入1,2,3等较小的数时,结果正确.奇怪的是,输入4以上的数时,全输出0.我苦思冥想,找不出哪儿错了,double f(double x){\x05return(x*x+x);}#include#includevoid main(){\x05double x,dx=1,f1,temp;\x05scanf("%lf",&x);\x05temp=(f(x+dx)-f(x))/dx;\x05dx*=0.1;\x05f1=(f(x+dx)-f(x))/dx;\x05while(fabs(f1-temp)>0.00000000001)\x05{\x05\x05temp=f1;\x05\x05dx*=0.1;\x05\x05f1=(f(x+dx)-f(x))/dx;\x05\x05}\x05printf("%.16lf\n",f1);}

问题描述:

这个求导数的程序出现了逻辑错误?
这个程序求函数x^2+x的导数.输入1,2,3等较小的数时,结果正确.奇怪的是,输入4以上的数时,全输出0.我苦思冥想,找不出哪儿错了,
double f(double x)
{
\x05return(x*x+x);
}
#include
#include
void main()
{
\x05double x,dx=1,f1,temp;
\x05scanf("%lf",&x);
\x05temp=(f(x+dx)-f(x))/dx;
\x05dx*=0.1;
\x05f1=(f(x+dx)-f(x))/dx;
\x05while(fabs(f1-temp)>0.00000000001)
\x05{
\x05\x05temp=f1;
\x05\x05dx*=0.1;
\x05\x05f1=(f(x+dx)-f(x))/dx;\x05
\x05}
\x05printf("%.16lf\n",f1);
}

1.错误原因是这样的:
当输入大于4的时候,由于dx减小的太快,使得fabs(f1-temp)的值反而增大,越来越离谱,最后dx减为0,分母为除数,出错,退出循环.显示异常.
2.解决方案:
可适当增大dx每次相乘的系数,如:dx*=0.5; ----经我验证没有问题.