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个毫秒左右,晕死! 用在什么上的,为什么要开方运算? 这么简单的代码,可以直接手工翻译成汇编吧。 MARK 不是有个奇妙的数据,开方迭代三次就够精度的算法吗 回复【4楼】888888888888
不是有个奇妙的数据,开方迭代三次就够精度的算法吗
-----------------------------------------------------------------------
那个是对浮点数的…… 试试这个看看
/*-----------------------------------------------------------------
功能: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;
} mark mark 6楼的算法很快。
MARK 开方 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;
} 看《hacker's delight》这本书 mark ! 在计算GPS 距离时用到。 都是高手啊,7楼强悍 你自己编写试试吧 这个程序速度还可以,200多个指令周期,如果1us一条指令,大概200多uS;是不是你的频率较慢。 楼主数学课睡觉还是泡妞了
级数展开,去掉高阶小项就行了
页:
[1]