一般我们求平方根使用牛顿迭代法,实现代码如下:
double newtonMethod(double toBeSqrted) {
double x = 1.0;
while(abs(x * x - toBeSqrted) > 1e-5) {
x = (x + toBeSqrted / x) / 2;
}
return x;
}
还可以用二分查找,这个原理较为简单,不过算法复杂度较高。
float sqrtByBisection(float n) {
if (n < 0)
return n;
float mid,last;
float low, up;
low=0, up = n;
mid = (low + up) / 2;
do {
if(mid * mid > n)
up = mid;
else
low = mid;
last = mid;
mid = (up + low) / 2;
} while(abs(mid- l ast) > eps);
return mid;
}
#include
#include
#include
#define MAX_ITER 200
int main()
{
double x=2;
double sqrt_1(double x,double eps); /*eps是精度*/
printf("sqrt(%lf)=%lf\n",x,sqrt_1(x,1e-6));
getch(); /*VC编译器应去掉这一行*/
return 0;
}
double sqrt_1(double x,double eps)
{
double r1=0,r2=0;
int i=0;
do
{
if (i++==0)
r1=1;
else
r1=r2;
r2=(r1+x/r1)/2;
}while(fabs(r1-r2)>eps || i>MAX_ITER);
return r2;
}
呵呵呵,这个就不是编程题了,是个纯粹的数学题了,要计算平方根的话,方法多如牛毛,比如使用,牛顿插值,泰勒展开,卡马克的快速平方根算法,等等,了解下算法,写程序也就几分钟。
楼上的确实很厉害呀,不过我这儿有更简单的算法……
不是不让用SQRT吗?那我用pow函数总可以了吧。
这函数也在math.h里,
这么用
double x;
pow(x,0.5);
这就OK了,x的0.5次方不就是它的平方根吗?
哈哈!
http://wenku.baidu.com/view/6b74c622bcd126fff7050bfe.html