没有使用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开始,作为平方根值的第一个近似值。 然后,在每一步中,通过取当前值y
和x/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