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

给定一个正数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;
}

http://blog.csdn.net/wumuzi520/article/details/7026808

惊人的代码(求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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值