石鑫华视觉论坛

 找回密码
 注册会员
查看: 3267|回复: 0

[原创] LabVIEW浮点数等于比较不相等

[复制链接]
  • TA的每日心情

    13 小时前
  • 签到天数: 3384 天

    连续签到: 6 天

    [LV.Master]2000FPS

    发表于 2019-7-23 10:23:13 | 显示全部楼层 |阅读模式 来自:广东省东莞市 电信

    注册登陆后可查看附件和大图,以及购买相关内容

    您需要 登录 才可以下载或查看,没有账号?注册会员

    x
    在群里有人发了一个问题,大概意思就是在一个WHILE中,设置了一个移位寄存器,初始值为1(DBL),然后每次执行时+0.002,相加后的值与3(DBL)比较,如果相等,则停止WHILE。结果发现运行时,根本停不下来,框图如下图所示:
    QQ图片20190723101116.png
    浮点数等于比较不相等
    这种情况,其实在每种编程平台中,都是存在的,主要原因就是在于浮点数的小数精度位上。DBL是双字节62位,精度也就是在15位。而超过15位后,是一个未知的状态。所以,如上面的框图中,1、0.002、3,这些常量,我们都可以认为是有固定小数位数的。但是在加法函数后面,其实是具有不确定的小数位数的。所以,虽然我们理解上当2.998+0.002,理论上是等于3的,实际上其值可能在内存里应该是3.000000000000000,这样的表示方式,而后面16位的小数精度位,就更加没有办法来确定是什么值了。所以这里是不相等的情况。而要解决这个问题,只需要在加法后面,做一次强制小数位数的功能即可,如将DBL强制为3位小数,这样就会和后面的3相等了,哪怕是强制15位小数,也是可以相等的,但是如果强制16位小数,那就不行了,DBL没有办法表示16位小数。
    20190723101457.png
    强制3位小数可以停止
    QQ截图20190723102606.png
    强制15位小数可以停止
    QQ截图20190723102658.png
    强制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

    浮点数等于比较.vi (9.17 KB, 下载次数: 41)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册会员

    本版积分规则

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

    QQ|石鑫华视觉论坛 |网站地图

    GMT+8, 2024-11-22 21:31

    Powered by Discuz! X3.4

    © 2001-2024 Discuz! Team.

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