找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2920|回复: 1
打印 上一主题 下一主题
收起左侧

自己得出的浮点数近似算法

[复制链接]
跳转到指定楼层
楼主
ID:140343 发表于 2016-9-24 19:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    近来工作中发现了一种浮点数运算的近似算法,也不知道前人有没有这样应用过,反正自己到目前还没见过,就暂且称作自己发现的。如有类同,纯属巧合。本算法对嵌入式编程的人有很大用处,其他领域就不知道了。现整理如下,希望对需要的人有所帮助。 -
    大家都知道,乘法相对好运算些,也有现成的公式可以分解、简化,使其运算简单符合自己的要求,但除法有时却找不到什么公式可以把它分解的符合自己的要求,特别是对做8位机编程的人,浮点数运算很占空间又影响执行速度,所以一般都需要化成整数进行运算
举例如下:
10位AD采集,最大值是1023,如果需要利用AD采集结果对输出进行连续控制,就需要对AD进行细分,假设细分500份,那么每份就是1023/500=2.046,假如只取整数部分,则最大值时会有较大误差,假如用浮点数则输出 =
实际值/2.046,但8位MCU不喜欢浮点数,那么此时就要换一种方法,如下:
1.把最大值分为可被细分数整除的整数部分+小数部分,如被500除1023可分为1000+23;被300除可分为900+123;
2.把能被整除的整数部分除以除数得出最小细分整数部分,如1000/500=2;900/300=3;
3.把实测数除以最小细分数得得出修正前的整数;
4.把修正前的整数乘以步骤1中的尾数部分再除以满刻度值,得出修正数,把修正前的数减去修正数得出最终所需倍数,既所需要的结果;另外满刻度值最好是根据实际取一定的舍取值。例如,如果10位AD可取1000(其实取满刻度值应该除以1023,至于取1000是为了使偏差减小,不至于使输出结果超调),如果是8位AD可取250(其满刻度值是255,取250也是为了在采集值快达到满刻度值时防止输出结果超调,当然直接使用满刻度值也是可以的,为了防止超调要对输出结果做一个限幅).
例如1:对10位AD,满刻度1023分成500份,1023可分成1000+23,令z=1023/500=2.046,假设当前实测值x是635,那么此实测值x对应的输出值应是y=x/2.046=635/2.046=310,假如MCU不采用浮点数,z=1023/500=2,那么MCU算出的输出值是y=x/2=635/2=317,比实际值大了7个点;按照上面的公式,把y乘以尾数23除以1000得出修正数w=y×23/1000=317×23/1000=7,按照步骤5把y减去修正数即得出与实际没有误差的结果y-w=317-7310
例如2:对于8位AD,满刻度255分成100份,255可分成200+55,令z=255/100=2.55,假设当前实测值x是226,那么此实测值x对应的输出值应是y=x/2.55=226/2.55=88,假如MCU不采用浮点数,z=255/100=2,那么MCU算出的输出值是y=x/2=226/2=113,比实际值大了25个点;按照上面的公式,把y乘以尾数55除以250得出修正数w=y×55/250=113×55/250=24,按照步骤5把y减去修正数即得出与实际没有误差的结果y-w=113-2489 ,与88只差一个点;假设当前实测值x是满刻度值255,那么此实测值x对应的输出值应是y=x/2.55=255/2.55=100,假如MCU不采用浮点数,z=255/100=2,那么MCU算出的输出值是y=x/2=255/2=127,比实际值大了27个点;按照上面的公式,把y乘以尾数55除以250得出修正数w=y×55/250=127×55/250=27,按照步骤5把y减去修正数即得出与实际没有误差的结果y-w=127-17100 ,没有误差不会超调。
如有异议请指正。以上纯属个人经验,对套用出错者不负任何责任,如若转载请注明出处!


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:712493 发表于 2020-6-10 17:39 | 只看该作者
挺有意思的算法 ,挖一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表