偶然在知乎上看到求解一个数开根号怎么求,闲来无事练习下C;
首先自己想到的就是二分法,写出来了才知道这个叫二分法,是一个比较直观的方法,比如求in的开根号,设置一个low,一个high,每次用low和high 的中值的平方去和in比较,在误差范围之内就退出,误差大就继续迭代,然后根据每次比较的结果更新low和high 的值,最后得到一个理想的结果。
牛顿法是在网上查的,做二分法时,感觉到可能迭代的太慢,二分肯定不是最优的,刚好看到牛顿迭代,在纸上画了下感觉也比较简单,就是求一个二次方程的根,根据切线方法来迭代,一下子找到迭代的规则,就可以写出来了。
下面是二分法和牛顿法的求根号的结果,按理说是牛顿比较快,感兴趣的可以研究下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double twofen(double in)
{
double out;
double low,high;
int i=0;
if (in<=0)
{
printf("fushu ,shurucuowu!");
return 0;
}
low=0;
high=in;
while(fabs(in-out*out)>0.0001)
{
out =(low+high)/2;
if(out*out>in) {high=out;}
else if(out*out<in) {low=out;}
i++;
}
return out;
}
double newton(double in)
{
double current;
double next;
current=1;
while(fabs(next*next-in)>0.0001)
{
next=(current+in/current)/2;
current=next;
}
return next;
}
void main()
{
double in;
printf("shuru yige zhengshu :\n");
scanf("%lf",&in);
printf("2fen(%lf) de jieguo shi %lf\n",in,twofen(in));
printf("---------------------\n");
printf("newton(%lf)de jieguo shi %lf\n",in,newton(in));
printf("finish");
}
注意的是都是double类型,如果不小心设置了int型,或者不小心用了abs,没用fabs就会得不到正确的结果哦。