您的位置:首页 > 其它

二分法、牛顿迭代法求sqrt()

2013-12-04 16:10 281 查看
给定一个正数a,不用库函数求其平方根。

设其平方根为x,则有x2=a,即x2-a=0。设函数f(x)= x2-a,则可得图示红色的函数曲线。在曲线上任取一点(x0,f(x0)),其中x0≠0那么曲线上该点的切线方程为



(1-1)

求该切线与x轴的交点得


(1-2)

因为1-2式中x0作为分母,所以在之前限定了一下初始值不要选0。那么得到的这个与x轴的交点其实是最终要求得的x的一次逼近,我们再以这个x基准继续迭代就可以求得更逼近的x,至于逼近到什么时候才算完,这个取决于你自己设定的精度。整个过程的迭代只需要几步就可以求得最终的结果。

double nt_sqrt(double n)
{
double x = 1.0;
while(abs(x*x-n) > 1e-5)
x = (x+n/x)/2;
return x;
}


/article/7931972.html

惊人的代码(求1/sqrt())http://www.cnblogs.com/pkuoliver/archive/2010/10/06/1844725.html

二分法:

int sqrt(int x)
{
int left = 1, right = x / 2;
int mid;
int last_mid; //记录最近一次mid
if (x < 2) return x;
while(left <= right)
{
mid = left + (right - left) / 2;
if(x / mid > mid)   // 不要用x > mid * mid,会溢出
{
left = mid + 1;
last_mid = mid;
}
else if(x / mid < mid)
{
right = mid - 1;
}
else
{
return mid;
}
}
return last_mid;
}


double sqrt(double n) //用二分法
{
if(abs(n-(1e-5))<0) //小于0的按照你需要的处理
return n;
double mid,last;
double 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-last) > eps); //精度控制
return mid;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: