用牛顿迭代法求一个整数(只求整数)的平方根!

波波911 2014-03-08 12:16:33
请高手指点一下!重写一个sqrt()--求一个32位的整数的平方根的算法,开根号后是一个16位的int 型~!!请高手帮个忙哈!分数会给大家的!
...全文
544 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
波波911 2014-03-08
  • 打赏
  • 举报
回复
也就是说,该平台不支持浮点数运算!只支持整数运算!
jianpanlanyue 2014-03-08
  • 打赏
  • 举报
回复
主要思想:设要求的这个数为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 );
lm_whales 2014-03-08
  • 打赏
  • 举报
回复
引用 5 楼 shenren911 的回复:
[quote=引用 4 楼 shenren911 的回复:] 请问楼上的!你那个 [quote=引用 3 楼 lm_whales 的回复:] 这里有个无符号整型,移位开平方的方法,不是牛顿法,可以不? 模拟手动开放的实现
/** 移位开方法 **/
/**  两个无符号整型数据一起左移              **/
#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;
}
那个shl_2_n(remain,n,2)是什么意思啊?[/quote] 是把n逻辑左移2位吗?[/quote]
shl_2_n(remain,n,2)
是把remain,和n, 当作一个双倍精度整数移位,应该是是算术左移吧. 相当于
typedef unsigned long long uint64 ;
uint64 a = (uint64)remain<<32 + n;
a <<= 2;
remain = a >>32;
n =a;
不过,不用考虑平台问题,当 uint64替换unsinged 结果同样可用 主要考虑数据类型的独立性 ,不会因为,两种不同无符号整数类型的,不可移植性,造成程序不可移植性 作用不大
波波911 2014-03-08
  • 打赏
  • 举报
回复
引用 4 楼 shenren911 的回复:
请问楼上的!你那个 [quote=引用 3 楼 lm_whales 的回复:] 这里有个无符号整型,移位开平方的方法,不是牛顿法,可以不? 模拟手动开放的实现
/** 移位开方法 **/
/**  两个无符号整型数据一起左移              **/
#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;
}
那个shl_2_n(remain,n,2)是什么意思啊?[/quote] 是把n逻辑左移2位吗?
波波911 2014-03-08
  • 打赏
  • 举报
回复
请问楼上的!你那个
引用 3 楼 lm_whales 的回复:
这里有个无符号整型,移位开平方的方法,不是牛顿法,可以不? 模拟手动开放的实现
/** 移位开方法 **/
/**  两个无符号整型数据一起左移              **/
#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;
}
那个shl_2_n(remain,n,2)是什么意思啊?
lm_whales 2014-03-08
  • 打赏
  • 举报
回复
这里有个无符号整型,移位开平方的方法,不是牛顿法,可以不? 模拟手动开放的实现
/** 移位开方法 **/
/**  两个无符号整型数据一起左移              **/
#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;
}

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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