打印
[经验分享]

浮点数近似算法

[复制链接]
1832|41
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
saservice|  楼主 | 2024-2-18 20:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  近来工作中发现了一种浮点数运算的近似算法,也不知道前人有没有这样应用过,反正自己到目前还没见过,就暂且称作自己发现的。如有类同,纯属巧合。本算法对嵌入式编程的人有很大用处,其他领域就不知道了。现整理如下,希望对需要的人有所帮助。 -
    大家都知道,乘法相对好运算些,也有现成的公式可以分解、简化,使其运算简单符合自己的要求,但除法有时却找不到什么公式可以把它分解的符合自己的要求,特别是对做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 ,没有误差不会超调。
转自http://www.51hei.com/bbs/dpj-55844-1.html

使用特权

评论回复
沙发
lzmm| | 2024-3-4 14:13 | 只看该作者
在进行浮点数计算时可能会遇到精度损失的问题。这可能导致计算结果与理论值有微小的差异。因此,在设计浮点数近似算法时,需要充分考虑到精度问题,并尽可能减小精度损失。

使用特权

评论回复
板凳
wengh2016| | 2024-3-4 18:20 | 只看该作者
手动优化浮点运算代码以提高效率,或者利用编译器提供的优化选项,确保在没有硬件FPU的情况下,浮点算法的执行速度能够满足系统实时性的要求。

使用特权

评论回复
地板
adolphcocker| | 2024-3-5 10:00 | 只看该作者
在进行加减乘除等基本浮点运算时,需要仔细处理指数和有效值的对齐、结果的标准化与舍入等问题。这些操作的正确实施对于保证浮点数运算的准确性至关重要。

使用特权

评论回复
5
lihuami| | 2024-3-5 12:04 | 只看该作者
根据单片机的资源限制和应用程序的需求,选择合适的近似算法。常用的浮点数近似算法包括固定点表示法、有限精度浮点表示法、近似函数法等。其中,固定点表示法将小数点固定在某个位置,有限精度浮点表示法使用有限位数表示浮点数,近似函数法使用数学函数对浮点数进行近似。

使用特权

评论回复
6
saservice|  楼主 | 2024-3-6 08:18 | 只看该作者
在单片机上,由于温度、电源波动等因素,算法的稳定性更为重要。

使用特权

评论回复
7
mnynt121| | 2024-3-7 13:00 | 只看该作者
在单片机中,算法的复杂度可能会影响运算速度和资源占用。

使用特权

评论回复
8
gygp| | 2024-3-7 20:54 | 只看该作者
在使用近似算法时,需要了解误差的来源。误差可能来自于舍入误差、截断误差、浮点数表示误差等。在设计近似算法时,需要权衡误差来源

使用特权

评论回复
9
everyrobin| | 2024-3-7 23:06 | 只看该作者
为了减少浮点数运算的资源占用和提高运算速度,可以使用固定点数表示浮点数。固定点数表示可以通过整数和小数部分的位数来表示浮点数,从而避免了浮点数运算的舍入误差和数值稳定性问题。

使用特权

评论回复
10
macpherson| | 2024-3-9 17:02 | 只看该作者
在设计近似算法时,需要考虑运算效率。尽量选择运算量较小、易于实现的近似算法。

使用特权

评论回复
11
usysm| | 2024-3-10 08:52 | 只看该作者
为了提高单片机上浮点数近似算法的运行效率,需要对代码进行优化,如使用内联函数、循环展开、指令调度等技术。

使用特权

评论回复
12
cashrwood| | 2024-3-11 19:50 | 只看该作者
尽管浮点数具有硬件和编程语言的支持,使得使用起来更为方便,但在资源受限的单片机中,执行浮点运算可能会占用较多资源并影响执行速度。因此,在资源紧张的情况下,可能需要考虑将浮点数转换为整数进行运算。

使用特权

评论回复
13
saservice|  楼主 | 2024-3-11 21:41 | 只看该作者
在进行浮点数计算时,可能会遇到需要进行舍入的情况。舍入误差是指由于舍入操作而引起的误差。为了减小舍入误差,可以选择合适的舍入方式,如四舍五入、向上取整、向下取整等。

使用特权

评论回复
14
wengh2016| | 2024-3-12 12:28 | 只看该作者
浮点数占用的存储空间通常比整数大得多,尤其在资源受限的单片机中,需要合理安排存储布局,避免内存溢出。

使用特权

评论回复
15
vivilyly| | 2024-3-12 13:29 | 只看该作者
复杂的计算过程中,误差可能会累积。为了减小误差累积的影响,可以采用误差补偿、误差修正等方法。

使用特权

评论回复
16
earlmax| | 2024-3-15 14:34 | 只看该作者
在比较浮点数时,不应直接使用等于或不等于操作符,而是应该设定一个可接受的相对或绝对误差范围来进行近似比较。

使用特权

评论回复
17
fengm| | 2024-3-15 19:25 | 只看该作者
浮点数通过牺牲一定的有效数字来换取更大的表示范围。这意味着数值越大,其相对精度越差。因此,在应用时需根据实际需求考虑是否采用浮点数还是定点数。

使用特权

评论回复
18
yorkbarney| | 2024-3-16 11:27 | 只看该作者
浮点数运算可能会导致舍入误差。在单片机中,需要考虑舍入误差对算法精度的影响,并采取相应的措施来减小误差。

使用特权

评论回复
19
minzisc| | 2024-3-16 18:08 | 只看该作者
在使用近似算法时,需要注意数值范围和精度。数值范围表示近似算法能够表示的最大和最小数值,精度表示近似算法能够达到的最佳近似程度。在设计近似算法时,需要根据应用程序的需求,权衡数值范围和精度。

使用特权

评论回复
20
uiint| | 2024-3-16 20:50 | 只看该作者
许多嵌入式系统对实时性有严格要求。在进行浮点数近似算法时,需要确保算法能够在规定的时间内完成计算,以满足系统的实时性需求。

使用特权

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

本版积分规则

21

主题

1085

帖子

2

粉丝