用牛顿迭代法整数(只求整数)的平方根
用牛顿迭代法求一个整数(只求整数)的平方根!
请高手指点一下!重写一个sqrt()--求一个32位的整数的平方根的算法,开根号后是一个16位的int 型~!!请高手帮个忙哈!分数会给大家的!
------解决方案--------------------
主要思想:设要求的这个数为a,它的平方根为x;然后我们一开始令x=a;然后我们进入一个循环,不断的令x=(x+a/x)/2,就是令x等于 x和a/x的平均值,这样迭代了7-10次左右就可以得到a的平方根x的近似值。
假如我们求10的平方根,那么a=10,x=10;
( 10 + 10/10 ) / 2 = 5.5
( 5.5 + 10/5.5 ) / 2 = 3.659090909….
( 3.659090909 + 10/3.659090909)/2=3.1960050818631…..
……
写成code的话就是这样:
double my_sqrt(double a){
double x;
x=a;
for(int i=1;i<=10;i++) //要求精度高的话,可以设置次数多些,比如100
x=(x+a/x)/2;
return x;
}
这样就得到了一个浮点数a的平方根,当然了,平方根也是浮点型的。
如果只要求整形的话,可以运算后,转换成整形,比如: int result = (int)my_sqrt( (int)12.34 );
------解决方案--------------------
这里有个无符号整型,移位开平方的方法,不是牛顿法,可以不?
模拟手动开放的实现
请高手指点一下!重写一个sqrt()--求一个32位的整数的平方根的算法,开根号后是一个16位的int 型~!!请高手帮个忙哈!分数会给大家的!
------解决方案--------------------
主要思想:设要求的这个数为a,它的平方根为x;然后我们一开始令x=a;然后我们进入一个循环,不断的令x=(x+a/x)/2,就是令x等于 x和a/x的平均值,这样迭代了7-10次左右就可以得到a的平方根x的近似值。
假如我们求10的平方根,那么a=10,x=10;
( 10 + 10/10 ) / 2 = 5.5
( 5.5 + 10/5.5 ) / 2 = 3.659090909….
( 3.659090909 + 10/3.659090909)/2=3.1960050818631…..
……
写成code的话就是这样:
double my_sqrt(double a){
double x;
x=a;
for(int i=1;i<=10;i++) //要求精度高的话,可以设置次数多些,比如100
x=(x+a/x)/2;
return x;
}
这样就得到了一个浮点数a的平方根,当然了,平方根也是浮点型的。
如果只要求整形的话,可以运算后,转换成整形,比如: int result = (int)my_sqrt( (int)12.34 );
------解决方案--------------------
这里有个无符号整型,移位开平方的方法,不是牛顿法,可以不?
模拟手动开放的实现
/** 移位开方法 **/
/** 两个无符号整型数据一起左移 **/
#define shl_2_n(x,y,n) do{(x) <<= (n);(x)+= ((y) >>(sizeof(y)*8-(n)));(y) <<= (n); }while(0);
unsigned sqrt_ir(unsigned n,unsigned *re)
{
unsigned remain =0;
unsigned r =0;
unsigned k = sizeof(n)*8 / 2 ;
do {
r <<= 1;
shl_2_n(remain,n,2);
if(remain >= r*2 + 1 ) {
remain -= r * 2 + 1;
r ++;
}
}while(--k> 0);
*re = remain;
return r;
}