查看: 3204|回复: 16
收起左侧

[教程经验] 分享:浮点数精度问题

邀请回答

马上注册,享受更多特权

您需要 登录 才可以下载或查看,没有帐号?立即注册   

x
本帖最后由 Slimming 于 2022-4-6 18:35 编辑

分享一个计算机的知识,浮点数储存机制导致的精度问题

各位有没有遇到过浮点数多次相加,得到的结果却不是自己想要的,比如0.01相加100次理论结果应该是1,但是实际结果是0.999999344。或者再简单一点,0.3+0.4(常数)=0.7,0.3+0.4(变量)=0.700000048,
image.png
这其实就表明了浮点数计算存在精度问题。那么为什么会出现这样的问题呢?精度是如何丢失的?首先我们要清楚浮点数和整数储存数据的区别,了解浮点数储存的机制,才能有方法去解决相关精度问题。
直接给出结论,精度丢失在小数部分不断×2的过程中,有限的数据位无法表示无限的循环结果。

1.整数16位储存机制
简单说下整数储存,计算机语言储存采用二进制,一般使用的十进制数据输入计算机后均是转换为二进制进行处理,int型整数有16位,留1位符号位和15位数据位,数据区间-32768~32767(±2e15)。uint类型更直观,无符号16位数据位,高低字节更加清晰明了。其余双整型long之类就不谈了。

2.浮点数32位储存机制
image.png
浮点数也是采用二进制储存,但是不像整型数据从左到右按顺序来严格储存,而是分了三个区间,分别是:1位符号位、8位指数位、23位小数位。储存大概分为三步。

第一步:浮点数转换为二进制表示
  • 整数部分,直接转换为二进制,即:`100111`
  • 小数部分,让小数一直乘2,小于1则用结果继续乘,大于1则结果减1继续乘,等于1则结束。

image.png

第二步:科学计数法表示二进制小数#
注意:因为是二进制小数,所以底数是2
image.png

第三步:存储
注意:
①指数储存+127;
②因科学计数法表示相同,储存科学计数法省略前方的 ' 1. ';


image.png


例如:浮点数6.4


整数6表示二进制2#110,去除最高位后2#10
指数为6>2e2,指数部分为127+2=129,表示为2#1000 0001
小数部分0.4,表示为2#0110 0110 0110 0110 ……无尽循环,精度丢失就在这个环节!23位数据无限循环处理不完

组合起来数据:(0符号位)(1000 0001指数位)(10整数位0110 0110 0110 0110小数位)
image.png
各位可以在上位机仿真查看数据结果,将浮点数的字节拿出来,用仿真二进制显示。如有错误请指正。


精度问题解决方案

了解了浮点数储存机制后,精度的问题就显露出来了,小数部分位数越多越可能出现精度问题,个人想到的解决方案如下。

①最简单的提高精度方法是把float转成double储存,也就是32位的real类型转成64位的lreal类型。

②还有一种方法就是先将小数位放大去计算,计算完成后再缩小储存,可以防止计算过程中的精度问题,例如0.01相加1000次,可以改为0.01放大100倍=1,相加1000次后再除100。

③再有就是尽量以1/2^n的小数去储存,例如0.125,0.25,0.5,这样可以在有限的23位中表示完整的数据,就不会有精度问题了。






评分

参与人数 1水滴 +40 收起 理由
kkss + 40 剩的水滴都给你啦

查看全部评分





上一篇:请问大佬们有没有中型PLC和Proface触摸屏通讯的方法或例子
下一篇:中型PLC如何恢复出厂设置

已有 0 人打赏作者

回复 邀请回答送花

使用道具 举报

Slimming 2022-4-7 12:33:47 | 显示全部楼层
附加一条精度解决方案:
④23位小数位包含整数,整数越多小数越少,可以将小数位单独储存,那么23位小数位全部用来储存小数,精度也能随之提高,如果整数不是0且基本不变的情况下可以尝试此方法。
例如:数据a一直在100.1-100.3之间变化,那么可以认为整数100是不变的,仅取小数位0.1-0.3来储存可以提高6位(2^6=64<100)精度。
回复 送花

使用道具 举报

kkss 2022-4-6 22:23:13 | 显示全部楼层
很好的分享贴,一直没弄明白浮点数存储,感谢楼主科普!
回复 送花

使用道具 举报

zlcp 2022-4-7 09:17:56 | 显示全部楼层
本帖最后由 zlcp 于 2022-4-7 09:43 编辑
第三步:存储
注意:
①指数储存+127;
②因科学计数法表示相同,储存科学计数法省略前方的 ' 1. ';

单精浮点指数范围-128~127,上面写的“126~127”


回复 送花

使用道具 举报

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

本版积分规则

有技术问题,就上汇川技术社区

INOVANCE汇川技术 公众号

扫码下载掌上汇川APP

全国服务热线:8:30-17:30

4000-300124

苏州地址:江苏省苏州市吴中区越溪友翔路16号

深圳地址:深圳市龙华新区观澜街道高新技术产业园汇川技术总部大厦

Copyright © 2003-2100 汇川技术 Powered by Discuz! X3.4 ( 苏ICP备12002088号 )
快速回复 返回列表 返回顶部