没有使用sqrt函数查找平方根?

我找到了不使用sqrt函数找出平方根的算法,然后尝试进入编程。 我最终在C ++中使用这个工作代码

    #include <iostream>
    using namespace std;

    double SqrtNumber(double num)
    {
             double lower_bound=0; 
             double upper_bound=num;
             double temp=0;                    /* ek edited this line */

             int nCount = 50;

        while(nCount != 0)
        {
               temp=(lower_bound+upper_bound)/2;
               if(temp*temp==num) 
               {
                       return temp;
               }
               else if(temp*temp > num)

               {
                       upper_bound = temp;
               }
               else
               {
                       lower_bound = temp;
               }
        nCount--;
     }
        return temp;
     }

     int main()
     {
     double num;
     cout<<"Enter the numbern";
     cin>>num;

     if(num < 0)
     {
     cout<<"Error: Negative number!";
     return 0;
     }

     cout<<"Square roots are: +"<<sqrtnum(num) and <<" and -"<<sqrtnum(num);
     return 0;
     } 

现在问题在于初始化声明中的迭代次数nCount(这里是50)。 例如,要找出36的平方根,需要22次迭代,所以没有问题,而找到15625的平方根需要50次以上的迭代,所以它会在50次迭代后返回temp的值。 请为此提供解决方案。


你的算法很糟糕。 有更好的算法,最多需要6次迭代才能收敛到双数的最大精度:

#include <math.h>

double sqrt(double x) {
    if (x <= 0)
        return 0;       // if negative number throw an exception?
    int exp = 0;
    x = frexp(x, &exp); // extract binary exponent from x
    if (exp & 1) {      // we want exponent to be even
        exp--;
        x *= 2;
    }
    double y = (1+x)/2; // first approximation
    double z = 0;
    while (y != z) {    // yes, we CAN compare doubles here!
        z = y;
        y = (y + x/y) / 2;
    }
    return ldexp(y, exp/2); // multiply answer by 2^(exp/2)
}

算法从1开始,作为平方根值的第一个近似值。 然后,在每一步中,通过取当前值yx/y之间的平均值来改进下一个近似。 如果y = sqrt(x) ,它将是相同的。 如果y > sqrt(x) ,那么x/y < sqrt(x)大约相同的量。 换句话说,它会很快收敛。

更新 :为了加速非常大或非常小的数字的收敛速度,更改了sqrt()函数以提取二进制指数并从[1, 4)范围内的数字计算平方根。 它现在需要<math.h> frexp()来获得二进制指数,但可以通过从IEEE-754数字格式中提取位而不使用frexp()来获得指数。


如果您需要查找平方根而不使用sqrt() ,请使用root=pow(x,0.5)

其中x是您需要查找的平方根的值。


完全删除你的nCount (因为这个算法需要很多次迭代)。

double SqrtNumber(double num)
{
    double lower_bound=0; 
    double upper_bound=num;
    double temp=0;

    while(fabs(num - (temp * temp)) > SOME_SMALL_VALUE)
    {
           temp = (lower_bound+upper_bound)/2;
           if (temp*temp >= num)
           {
                   upper_bound = temp;
           }
           else
           {
                   lower_bound = temp;
           }
    }
    return temp;
 }
链接地址: http://www.djcxy.com/p/86637.html

上一篇: Finding square root without using sqrt function?

下一篇: Integer square root in python