打印
[应用相关]

cotex M3开方函数SQRT

[复制链接]
7699|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fqingy2003|  楼主 | 2008-11-17 09:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
谁有cotex M3开方函数,是32位或64位整数开方的函数,多谢提供者,本人非常需要
keil c的函数库中只有double的开方函数,太慢了,我的50多个模拟量需要开方,光开方在72Mhz下都需要10多ms,这是不能接受的

沙发
fqingy2003|  楼主 | 2008-11-17 09:41 | 只看该作者

在线等待大家的好消息呀

在线等待大家的好消息呀,急急的

哪位位大侠有呀

使用特权

评论回复
板凳
fqingy2003|  楼主 | 2008-11-17 10:12 | 只看该作者

香水城,求救

使用特权

评论回复
地板
香水城| | 2008-11-17 10:23 | 只看该作者

谢谢你的信任,我也没有这样的函数

使用特权

评论回复
5
ijk| | 2008-11-17 12:03 | 只看该作者

开方函数SQRT

  开方函数SQRT,记得在其它版面有人讨论过,速度号称很快

使用特权

评论回复
6
zhang..yb| | 2008-11-17 13:04 | 只看该作者

如果会手工算开方,这个程序不难吧

使用特权

评论回复
7
ijk| | 2008-11-17 14:19 | 只看该作者

同意楼上

  同意楼上,手工算开方是万能的,不管用哪个CPU(MCU,MPU,DSP)

使用特权

评论回复
8
fqingy2003|  楼主 | 2008-11-17 15:43 | 只看该作者

多谢大家的意见,手工开放是用十进制的

多谢大家的意见,手工开放是用十进制的,计算机怎么要实现这个手工开方,还不如用double库了
我要的是实质性的建议

使用特权

评论回复
9
香水城| | 2008-11-17 15:50 | 只看该作者

十进制运算与二进制运算没有本质区别

7楼这个建议就是一个实质性的建议,估计楼主是想要现成的程序吧。

使用特权

评论回复
10
vigia| | 2008-11-17 16:18 | 只看该作者

看看这个,网上随便找找很多啊

http://www.power-bbs.com/zixun/jishuwenzhang2/20070903/18935.html

使用特权

评论回复
11
lianshumou| | 2008-11-17 17:17 | 只看该作者

目前最快的算法是牛顿叠代

使用特权

评论回复
12
fqingy2003|  楼主 | 2008-11-17 18:41 | 只看该作者

多谢,多谢

我已经找到了,手算的方法,我想使用TI的函数原型,可是M3没有数符号的指令
需要一位一位的移动太费劲了,所以我就使用了手算,循环16次,虽然比T1的32的条无跳转指令慢了一下,但还是可以接受的

多谢大家的指点

使用特权

评论回复
13
lianshumou| | 2008-11-17 19:33 | 只看该作者

直接展开循环多快,不用跳转!

使用特权

评论回复
14
王紫豪| | 2008-11-17 23:54 | 只看该作者

想块?查表,哈哈

使用特权

评论回复
15
ijk| | 2008-11-18 10:12 | 只看该作者

牛顿迭代

  牛顿迭代,确实很快,对32位数据进行开方,大概只需3个循环;对64位数据进行开方,估计6个循环就够了

使用特权

评论回复
16
luckiest| | 2008-11-18 11:15 | 只看该作者

牛迭,初始值查表。

ARM优化那本书上有的。
俺老师用过

使用特权

评论回复
17
香水城| | 2008-11-18 14:37 | 只看该作者

楼主不厚道,大家帮你这么多忙,你问题解决了也不把代码

下次再来问问题,别人可能就没有这么热心了。

使用特权

评论回复
18
makesoft| | 2008-11-18 21:01 | 只看该作者

过分强调运算时间一般都是程序结构没有考虑好

使用特权

评论回复
19
老狼| | 2008-11-19 00:34 | 只看该作者

直接调用就可以了!

unsigned int Real_Sqrt_16(unsigned long int M)
{
    unsigned int N, i; 
    unsigned long tmp, ttp;   // 结果、循环计数 
    if (M == 0)               // 被开方数,开方结果也为0      
       return 0;     
    N = 0;     
    tmp = (M >> 30);          // 获取最高位:B[m-1]   
    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; 
}

使用特权

评论回复
20
老狼| | 2008-11-19 00:54 | 只看该作者

估计楼主用的就是这个,哈哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

124

帖子

0

粉丝