版权声明:原创文章,转载请声名。 https://blog.csdn.net/qq_40707451/article/details/86303512
对于这个问题,最直接的方法是使用库函数,这里我们主要探讨如何自己实现一个sqrt函数。
函数形式:Sqrt(int val,double t)
val为所求数,t为精度。
如何求一个正整数的平方根呢?
对于一个正整数val,简单粗暴点直接0-val全部进行搜索,直到达到其精度。
这里采用二分的思想,假设val=10,查找区间为(0,10),取val的中间值mid=5,mid平方和val比较之后,确定下一次查找的区间变为(0,5),依次类推。
C代码表达如下:
double Sqrt(int val, double t)
{
if (val < 0 || t<0)
return 0;
double left = 0;
double right = val;
double mid = (right + left) / 2;
double offset = 2*t ;
int count = 0;
while (offset>t)
{
double sq = mid*mid;
if (sq > val)
{
right = (left + right) / 2;
offset = sq - val;
}
if (sq <= val)
{
left = (left + right) / 2;
offset = val - sq;
}
mid = (left + right) / 2;
count++;
}
printf("count:%d\n", count);
return mid;
}
二分法查找的方式十分简洁,但是查找次数相对较多,我们可以使用另一种方法来更好的获取平方根。
牛顿迭代法
主要思想:使用切线来无限逼近,具体数学推导就不赘述了,大家可以百度。
C代码表达如下:
double SqrtIterator(int val,double t)
{
double k = val;
int count = 0;
while (fabs(k*k-val)>t)
{
k=(k+val/k) / 2.0;
count++;
}
printf("count:%d\n", count);
return k;
}
代码相对于二分来说更加简洁,但这里使用了一个库函数,不过即使自己定义了也是很简洁的,而且迭代次数较少。
减少对库的依赖,拓展思路。