搜索
bottom↓
回复: 8

再来个整数开方程序,超快

[复制链接]

出0入0汤圆

发表于 2009-8-8 12:52:27 | 显示全部楼层 |阅读模式
unsigned int sqrt_16(unsigned long M)
{
      unsigned int N, i;
      unsigned long tmp;//,ttp;
      union
      {
              ulong  ttp_u;
              uchar  ttp_a[4];
             
      }ttp_us;
      
      if (M == 0)
      return 0;
      N = 0;
      ttp_us.ttp_u=M;
      
     tmp = (ttp_us.ttp_a[0]>>6);//注意编译器顺序
       M <<= 2;
      if (tmp > 0)
          { N ++;
              tmp -= N;
              }
              for (i=15; i>0; i--)
              { N <<= 1;
                  tmp <<= 2;
                   tmp += (M >> 30);
                   ttp_us.ttp_u = N;
                    ttp_us.ttp_u = (ttp_us.ttp_u<<1)+1;
                     M <<= 2;
                     if (tmp >= ttp_us.ttp_u)
                          { tmp -= ttp_us.ttp_u;
                                   N ++; }
               }
               return N;
           }

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2009-8-8 14:49:00 | 显示全部楼层
一点也不快,呵呵,比编译器自带的浮点开方函数还慢5倍 ^_^

出0入25汤圆

发表于 2009-8-8 17:02:09 | 显示全部楼层
gcc 做的比lz快。今天看波形试了一下

出0入0汤圆

发表于 2009-8-8 18:58:50 | 显示全部楼层
没说啥芯片吧

出0入0汤圆

发表于 2009-8-8 22:49:57 | 显示全部楼层
在51或者AVR里,这个程序是绝对快不过浮点开平方函数的,因为移位用得太多了,除非用的是有桶形移位器的单片机。光是“tmp += (M >> 30)”这一句,CPU就要执行120次右移指令……

出0入0汤圆

 楼主| 发表于 2009-8-10 08:13:18 | 显示全部楼层
unsigned int sqrt_16(unsigned long M)
{
      unsigned int N, i;
      unsigned long tmp,M1,tmp2;
      union
      {
          ulong  ttp_u;
          uint  ttp_a[2];
         
      }ttp_us;
      
      if (M == 0)
      return 0;
      N = 0;
      M1=M;
      ttp_us.ttp_u=M;
      
     tmp = (ttp_us.ttp_a[1]>>14);
       ttp_us.ttp_u<<= 2;
      if (tmp > 0)
          { N ++;
              tmp -= N;
              }
              for (i=15; i>0; i--)
              { N <<= 1;
                  tmp <<= 2;

                   tmp += (ttp_us.ttp_a[1]>>14);
                   tmp2 = N;
                    tmp2 = (tmp2<<1)+1;
                    ttp_us.ttp_u <<= 2;
                     if (tmp >= tmp2)
                          { tmp -= tmp2;
                               N ++; }
               }
                tmp=(ulong)(N*N);
               if((uint)(M1-tmp)>N)
                {
                ++N;
                 }
               return N;
           }


再优化下,我用的16位单片机,有
SHRW AX, cnt 指令,一周期,所以快,
不好意思没说清楚,谢谢各位在其他单片机上验证
头像被屏蔽

出0入0汤圆

发表于 2010-1-24 12:52:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2013-9-5 11:01:29 | 显示全部楼层
hacker's delight这本书里面有整形快速开方。

出0入0汤圆

发表于 2014-1-24 08:48:14 | 显示全部楼层
学习了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表