【发布时间】:2013-11-05 19:58:38
【问题描述】:
我在不使用 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 number\n";
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 的值。请给出解决方案。
【问题讨论】:
-
:)
root = pow(x,0.5); -
通常您会检查每次迭代所产生的差异,当它下降到某个水平以下时,您会将结果视为足够准确。另请注意,牛顿法通常比您使用的二分法快很多。
-
如何检查 temp*temp 和数字之间的差异并在足够接近时停止循环?
-
@jrok 喜欢它!严肃地说,这是专业的方式:en.wikipedia.org/wiki/Newton's_method
-
@MartinBeckett 是的,如果(temp*temp-num > 0.001){upper_bound = temp;}else {lower_bound = temp; 0.001 是否足够接近?