仪表设计中的浮点数问题及解决办法

比较表3和表2的数据可以看出,采用转存方法对累积量进行存储后,很好地解决了测量精度随时间增加而变差的问题。我们对累积量计数满99 999 999的前后阶段也进行了测试,实验结果表明,测量误差与表3中的误差一致,这表明在全量程范围内误差都稳定在一个令人满意的范围内。此种方法与利用汇编编程处理的方法相比,避免了利用汇编代码处理浮点数的繁琐工作,保持了C语言的高效性和代码的良好移植性。
2 存储问题
项目要求在流量计正常运行时能够随时设定液体的密度、流量系数等参数,并且这些参数小数点后数据的位数固定。比如密度设定值,数据设定范围为0.001~999.999,小数点后固定为3位数据。程序编制完毕在调试阶段发现的问题是,当把参数设置完毕存入EEPROM、再读出来时,读出的数据和存入的数据并不一致。比如设定密度值为123.456,设定完毕存入EEPROM,然后读出来的数据是形如123.454这样的数据。
经过仔细研究最终发现,问题还是出现在对float型数据的处理上。由参考文献可知,float型数据在存储时,存储的并不是精确值,而是近似值。而在设计程序时,定义密度设定值dEn为float型,并直接对其进行存取处理。针对这个问题的处理办法是,定义dEn为unsigned long型的数据,其中存放的数据是密度实际设定值放大1000倍后的数据,在程序其他地方用到密度设定值时,只需要将其除以1000得到真实值即可。这样在参数设定完毕存入。EEPROM及从EEPROM中读出数据时,实际上都是以整数形式进行操作的,这样就可以保证数据的正确性。为了给操作者一种仍旧是在设定一个小数点后有3位小数的参数的感觉,在设定和显示参数过程中,始终点亮LCM141相关数据位的小数点。
结语
本文讨论了笔者在设计流量计的过程中,利用C语言操作浮点数所遇到的问题,这种问题在其他仪表及嵌入式系统设计中也是普遍存在的。针对这些问题给出了解决方法,且已经成功地在实际项目中得到应用,具有一定的参考价值。
C语言 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
