求开平方的算法

liujiboy 2003-10-24 08:33:21
开平方的算法,到目前为止我只找到《九章算术》中的平方根算法,但是好像该算法只能开到整数为止,现在求一个实数范围的平方根算法。
...全文
1221 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
pheavecn 2003-12-08
  • 打赏
  • 举报
回复
/*1. 模拟笔算开平放的整数开平方算法:

笔算开平方的算法:

xa xb xd
----------------------
/ a, b c, d e.
xa^2
---------------------
ya xb/ a1, b c, d e ; ya = 2*xa
za zb zc ; za zb zc = ya xb * xb
---------------------
ya2 yb2 xd/ a2, b2 c2, d e ; ya2 yb2 = 2* xa xb
za1, zb1 zc1, zd1 ze1 ; za1 zb1 zc1 zd1 ze1 =
--------------------- ya2 yb2 xd * xd
................

For example:
2 7 4
-------------
/ 7 5 5 7 8.
4
-------------
4 7/ 3 5 5
3 2 9
-------------
5 4 4/ 2 6 7 8
2 1 7 6
-------------
5 0 2

*/

int _sqrti(int n)
{
int r,l,t; //r: 方根; l: 余数; t: 试除数;

if(n<100)
{
r = 9;
while(n < r*r) r--;
}
else
{
r = _sqrti(n/100);
l = n - r*r*100;
t = l/(r*20);
while( t*(r*20 + t) > l ) t--;
r = r*10 + t;
}
return r;
}


/*2. 迭代法:
迭代公式:x[n+1]=(x[n]+y/x[n])/2
可以证明,x[n]收敛到y^(1/2),而且收敛速度较快。
*/
double _sqrt(double y)
{
#define eps 1e-15
double x1,x2;

if(y<eps) return 0;

x2= y>1.0? y/2 : y*2;

do{
x1 = x2;
x2 = (x1 + y/x1)/2;
}while(fabs(x2-x1) > eps);

return x2;
#undef eps
}
liangbch 2003-10-25
  • 打赏
  • 举报
回复
牛顿迭代法,需要知道初值,初值选的不好,迭代次数将会增多,速度将会变慢,这里给出一个求整数平方根初值的算法。
定义一个数组
const int s[256]=
{0,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,4.........}
这个数组各个元素的值为其下标的平方根。

int sqrt_Base(int n)
{
return (n<=0)
return 0;

int rank=0;
while (n >=256) //求n的平方根
{
n =n >> 8; // n= n / 256
rank+=8;
}
return s[n] << (rank/2);
}
coolduckplus 2003-10-25
  • 打赏
  • 举报
回复
可以根据数列x(n)=(x(n-1)+a/x(n-1))/2近似求平方根
answerear 2003-10-24
  • 打赏
  • 举报
回复
牛顿迭代法
hellomartin 2003-10-24
  • 打赏
  • 举报
回复
我不会,学习

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧