查找数字的sqrt的递归函数的问题

时间:2010-05-20 22:37:39

标签: c++

下面是一个简单的程序,它使用Bisection计算数字的sqrt。使用sqrtr(4,1,4)这样的调用执行此操作时会进行无休止的递归。我无法弄清楚为什么会这样。以下是功能:

double sqrtr(double N , double Low ,double High  )
{

     double value = 0.00;

     double mid = (Low + High + 1)/2;

    if(Low == High)
     {
        value =  High;

     }

     else if (N < mid * mid )
     {
        value = sqrtr(N,Low,mid-1) ;


     }
     else if(N >= mid * mid)
     {
         value = sqrtr(N,mid,High) ;

     }

     return value;

}

4 个答案:

答案 0 :(得分:5)

您可能需要在low == high比较中设置一个范围,即high - low < .000001,以获得六位小数的精度。

答案 1 :(得分:4)

除了终止条件不好外,你是怎么做到的:

 else if (N < mid * mid )
 {
    value = sqrtr(N,Low,mid-1) ;

mid-1如何合理?你没有为整数二进制搜索剪切和粘贴一些代码吗?

答案 2 :(得分:0)

依赖于彼此相等的浮点值很少是一个好主意。因为与整数不同,它们很容易偏离它们所代表的值范围内的所有值。

因此,您可能需要对给定的精度进行比较,而不是完全相等。

正如上面其中一条评论所指出的那样,你应该看看论文"What Every Computer Scientist Should Know About Floating-Point Arithmetic"。这是一篇关于浮点数性质的经典优秀论文。

答案 3 :(得分:0)

有几个问题。正如jpalecek所指出的那样,看起来你已经为一个索引数组剪切并粘贴了一个(不是很好的)二进制搜索例程而不了解它是如何工作的。此外,终止标准过于严格。

我认为这是一个学习练习,因为二分和递归是解决sqrt()的一种非常糟糕的方法。

以下代码有效,但速度非常慢且不准确。

#include <iostream>
using namespace std;

double sqrtr(double N , double Low ,double High  )
{
    // Precondition: Low and High, Low <= High, must be non-negative, and must
    // bracket sqrt(N).

     const double sqrt_mef = 1e-8; // Approximate square root of machine efficiency

     double mid = (Low + High)/2; // No +1

    if((High-Low)/(1+mid) < sqrt_mef)
     {
        return mid;
     }

     else if (N < mid * mid )
     {
        return sqrtr(N,Low,mid) ;  // No -1
     }
     else
     {
         return sqrtr(N,mid,High) ;
     }

}

int main()
{   
    double sqrt_2 = sqrtr(2.0, 0, 2.0);
    cout << sqrt_2*sqrt_2  << endl;
    getchar();
}