打印
[PIC®/AVR®/dsPIC®产品]

单片机运算根号速度慢问题求助

[复制链接]
2137|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
suicune66|  楼主 | 2016-4-2 18:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在用的8位PIC单片机,运行的根号数是32位的,发现运行一次,时间至少是1ms以上,请问有木有办法能提高速度呀
沙发
yqdeso| | 2016-4-3 23:48 | 只看该作者
木有办法,开根要用到大量的除法。而除法对于没有硬件除法的CPU来说就是灾难。你用的8位,如果是18F系列的话也只有硬件乘法。想要速度快换dsPIC33E或者带FPU的PIC32吧

使用特权

评论回复
板凳
suicune66|  楼主 | 2016-4-4 08:45 | 只看该作者
yqdeso 发表于 2016-4-3 23:48
木有办法,开根要用到大量的除法。而除法对于没有硬件除法的CPU来说就是灾难。你用的8位,如果是18F系列的 ...

看来只能如此了,谢谢

使用特权

评论回复
地板
xiaohua880123| | 2017-2-10 11:35 | 只看该作者
不知道你开根号要小数还是整数,小数就麻烦了,只能用库了。
如果整数可以挨个分段1-100里,你只要for1到10的平方.然后找出那两个比要开根号数大和小的两个靠近的数
然后100到900按上述方法
900到2500按上述方法
以此分段,这样运算快点

使用特权

评论回复
5
NE5532| | 2017-2-10 13:13 | 只看该作者
有后台的丢给后台算。

使用特权

评论回复
6
renxiaolin| | 2017-2-11 22:50 | 只看该作者
有招呀,我有一个算法是算开根号分之一,效率很高呀,你要开根号要在用1除这个数,
这个程序是老外写的,真牛,但我估计也应该有直接开根号的算法呀,
static float invSqrt(float number)
{
    volatile long i;
    volatile float x, y;
    volatile const float f = 1.5F;

    x = number * 0.5F;
    y = number;
    i = * (( long * ) &y);
    i = 0x5f375a86 - ( i >> 1 );
    y = * (( float * ) &i);
    y = y * ( f - ( x * y * y ) );
    return y;
}

使用特权

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

本版积分规则

29

主题

109

帖子

2

粉丝