石鑫华视觉 发表于 2019-7-23 10:23:13

LabVIEW浮点数等于比较不相等

在群里有人发了一个问题,大概意思就是在一个WHILE中,设置了一个移位寄存器,初始值为1(DBL),然后每次执行时+0.002,相加后的值与3(DBL)比较,如果相等,则停止WHILE。结果发现运行时,根本停不下来,框图如下图所示:

浮点数等于比较不相等
这种情况,其实在每种编程平台中,都是存在的,主要原因就是在于浮点数的小数精度位上。DBL是双字节62位,精度也就是在15位。而超过15位后,是一个未知的状态。所以,如上面的框图中,1、0.002、3,这些常量,我们都可以认为是有固定小数位数的。但是在加法函数后面,其实是具有不确定的小数位数的。所以,虽然我们理解上当2.998+0.002,理论上是等于3的,实际上其值可能在内存里应该是3.000000000000000,这样的表示方式,而后面16位的小数精度位,就更加没有办法来确定是什么值了。所以这里是不相等的情况。而要解决这个问题,只需要在加法后面,做一次强制小数位数的功能即可,如将DBL强制为3位小数,这样就会和后面的3相等了,哪怕是强制15位小数,也是可以相等的,但是如果强制16位小数,那就不行了,DBL没有办法表示16位小数。

强制3位小数可以停止

强制15位小数可以停止

强制16位小数,则无法停止

这种情况,在很多应用中都会看到,特别是我们对DBL的控件如果强制保留3位或几位小数点时,明明看到显示的可能都是一样的值,如3.141,但是比较后,其值是不相等的。这时,如果将小数位设置为4位或更多位数,则可以看到,一个控件可能是3.1411,另一个则是3.1413,这样两个值就不会相等了,虽然显示的时候是四舍五入都显示了3.141,但是内存中的值,仍然是不一样的。如果这时要做比较,就需要强制表示为一样的小数精度位数才可以。

上面框图中的DBL小数位强制保留几位的功能,请参考:
LabVIEW怎么强制DBL浮点形数字强制小数点位数_LabVIEW_图像处理|编程|机器视觉_视觉论坛VISIONBBS_视觉之家VISIONHOME_机器视觉光源_光源控制器_工业相机_工业镜头_机器视觉方案系统_图像处理教程_石鑫华视觉网_机器视觉论坛
http://visionbbs.com/thread-21624-1-1.html


附件为程序框图,LV2019


页: [1]
查看完整版本: LabVIEW浮点数等于比较不相等

LabVIEW HALCON图像处理入门教程(第二版)
石鑫华机器视觉与LabVIEW Vision图像处理PDF+视频教程11种全套
《LabVIEW Vision函数实例详解》教程-NI Vision所有函数使用方法介绍,基于NI VISION2020,兼容VDM21/22/23