下面是一个简单的程序,它使用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;
}
答案 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();
}