jansen_du 发表于 2010-5-28 20:34:06

32位开方运算

哪位大侠有32开方的汇编代码,跪求!

我用C语言的开发代码,太慢了,不知道是NEC的运算速度不行还是我的代码不行。

unsigned int LONG_SQRT_INT2(unsigned long M)
{
    unsigned int N, i;
    unsigned long tmp, ttp;   // 结果、循环计数
    if (M == 0)               // 被开方数,开方结果也为0
      return 0;
    N = 0;
    tmp = (M >> 30);          // 获取最高位:B
    M <<= 2;
    if (tmp > 1)            // 最高位为1
    {
      N ++;               // 结果当前位为1,否则为默认的0
      tmp -= N;
    }
    for (i=15; i>0; i--)      // 求剩余的15位
    {
      N <<= 1;            // 左移一位
      tmp <<= 2;
      tmp += (M >> 30);   // 假设
      ttp = N;
      ttp = (ttp<<1)+1;
      M <<= 2;
      if (tmp >= ttp)       // 假设成立
      {
            tmp -= ttp;
            N ++;
      }
    }
    return N;
}

网上找的,运算需要10个毫秒左右,晕死!

hsztc 发表于 2010-6-12 19:25:37

用在什么上的,为什么要开方运算?

eduhf_123 发表于 2010-6-12 19:35:46

这么简单的代码,可以直接手工翻译成汇编吧。

cuikai12345 发表于 2010-6-12 21:21:20

MARK

NJ8888 发表于 2010-6-12 21:32:45

不是有个奇妙的数据,开方迭代三次就够精度的算法吗

eduhf_123 发表于 2010-6-13 00:36:58

回复【4楼】888888888888
不是有个奇妙的数据,开方迭代三次就够精度的算法吗
-----------------------------------------------------------------------

那个是对浮点数的……

eastboy 发表于 2010-6-29 15:43:20

试试这个看看
/*-----------------------------------------------------------------
功能:32位整形数求平方根(程序取自《高效程序的秘密Hacker's Delight》)
输入:待求数据x
输出:平方根
-------------------------------------------------------------------*/
unsigned int isqrt32(unsigned long x)
{
   unsigned long m,y,b;
   m = 0x40000000;
   y = 0;
   while(m != 0)
{
    b = y | m;
    y = y >> 1;
    if(x >= b)
    {
       x = x - b;
       y = y | m;
    }
    m >>= 2;
   }
   return y;
}

cuikai12345 发表于 2010-6-29 18:44:41

mark

odqqdo 发表于 2010-6-29 19:32:48

mark

eduhf_123 发表于 2010-6-29 20:14:24

6楼的算法很快。
                                                          
MARK 开方

g921002 发表于 2010-6-29 21:10:04

http://supp.iar.com/FilesPublic/SUPPORT/000419/AN-G-002.pdf
unsigned int root(unsigned int x)
{
unsigned int a,b;
b = x;
a = x = 0x3f;
x = b/x;
a = x = (x+a)>>1;
x = b/x;
a = x = (x+a)>>1;
x = b/x;
x = (x+a)>>1;
return(x);
}
http://ww1.microchip.com/downloads/en/AppNotes/91040a.pdf
http://www.azillionmonkeys.com/qed/sqroot.html
/* by Mark Crowne */
        static unsigned int mcrowne_isqrt (unsigned long val) {
          unsigned int temp, g=0;

          if (val >= 0x40000000) {
          g = 0x8000;
          val -= 0x40000000;
          }

        #define INNER_ISQRT(s)                        \
          temp = (g << (s)) + (1 << ((s) * 2 - 2));   \
          if (val >= temp) {                        \
          g += 1 << ((s)-1);                        \
          val -= temp;                              \
          }

          INNER_ISQRT (15)
          INNER_ISQRT (14)
          INNER_ISQRT (13)
          INNER_ISQRT (12)
          INNER_ISQRT (11)
          INNER_ISQRT (10)
          INNER_ISQRT ( 9)
          INNER_ISQRT ( 8)
          INNER_ISQRT ( 7)
          INNER_ISQRT ( 6)
          INNER_ISQRT ( 5)
          INNER_ISQRT ( 4)
          INNER_ISQRT ( 3)
          INNER_ISQRT ( 2)

        #undef INNER_ISQRT

          temp = g+g+1;
          if (val >= temp) g++;
          return g;
        }

marx 发表于 2013-9-5 11:12:02

看《hacker's delight》这本书

abcd200844 发表于 2013-9-13 14:31:20

mark ! 在计算GPS 距离时用到。

zl326498096 发表于 2013-9-13 14:46:55

都是高手啊,7楼强悍

xuanfong1 发表于 2014-4-27 14:22:16

你自己编写试试吧

cjy3063 发表于 2014-5-28 21:30:54

这个程序速度还可以,200多个指令周期,如果1us一条指令,大概200多uS;是不是你的频率较慢。

canspider 发表于 2014-5-28 22:21:57

楼主数学课睡觉还是泡妞了
级数展开,去掉高阶小项就行了
页: [1]
查看完整版本: 32位开方运算