打印

适合32位及以下的单片机的开平方算法

[复制链接]
104|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
primojones|  楼主 | 2023-9-28 22:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

是不是觉得开平方直接调用C或Matlab内置sqrt就可以呢?这不是多此一举吗?

但是写单片机高速算法时,遇到你的算法周期总是快不起来呢?显示总卡屏呢?你机器总是很笨,反映不过来呢?没错,你的主体计算思路也许没错,就是卡在你调用的sqrt等函数上了,计算你的主体已经难以再精简了,那就有必要逐个有优化算法了.

比如:正余弦函数等,系统内置的都是泰勒展开式式计算

根据你需要选择合适的阶数嘛!非常正确,其它的呢?用泰勒原式嘛

没错,我们的开平方也可以用泰勒展开式计算

因此泰勒开平方根的代码如下:

// c++ code
double ans=1, pre=0;
while(abs(ans-pre)>1e-6)

{
    pre=ans;
    ans=(ans+x/ans)/2;
}

这个精度有点高,可以算,但是这个也不是最快嘛!

本笔者用我们单片机最擅长的移位算法,分别得出两周计算步数最少的开整数方根的算法:

sqrt1(unit16 data)//快速开方
{unit16  pbta;
pbta=data>>1;
while(pbta^2>data)
{pbta=pbta>>1;
}
while(pbta^2<data)
{pbta++;
}
return pbta;
}
//bitshit(num,n)

再次申明,此算法仅仅适合于整数开整数方根,对精度要求高的高手,请用前面的算法.


使用特权

评论回复
沙发
AloneKaven| | 2023-9-29 22:07 | 只看该作者
呃,没看懂怎么操作的

使用特权

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

本版积分规则

28

主题

1086

帖子

0

粉丝