如何避免两个相近的浮点数相减的时候计算出误差?

西门子plc 发布于 5个月前 分类:S7-300/400

S7中,如何避免两个相近的浮点数相减的时候计算出误差? 比如0.4-0.398=0.002000004

我要对实际值和设定值的偏差进行记录,但没想到并不算大的数值,也会出现这样的情况,导致数据库里面记录下来的数据大多带有一个小尾巴,真是讨厌啊!

谁能给出一个比较好的处理方法?从PLC的角度。

问题补充:
---------------------------------------------------------------------------------------------------
目前我用PLCSIM模拟,问题肯定是存在的:
L     MD   100
L     MD   104
-R
T     MD   108
NOP   0
L     4.000000e-001
L     3.980000e-001
-R
T     MD   208
多次监控,计算结果分别如下:

0.4-0.399=0.001000017
0.4-0.397=0.002999991
0.4-0.396=0.004000008
0.4-0.395=0.004999995
0.4-0.3=0.09999999

1个回复

  • plc电工爱好者

    碰到的问题,确实存在,我分别在模拟器和CPU315上试验了,结果确实。
    但是思考半天也没想到一个万全之策。
    倒是有一个特别绕弯的办法,我自己想出来也觉得不是很健全。不过暂且可以解决万老师提出的问题。下面我就说说,请各位不要见笑!也希望有人能提出更好的解决办法
    首先编写一个fc3:
    L     #IN1
    L     #IN3
    *R
    T     #TEM1
    L     #TEM1
    TRUNC
    T     #TEM2
    L     #IN2
    L     #IN3
    *R
    T     #TEM3
    L     #TEM3
    TRUNC
    T     #TEM4
    L     #TEM2
    L     #TEM4
    -D
    T     #TEM5
    L     #TEM5
    DTR
    T     #TEM6
    L     #TEM6
    L     #IN3
    /R
    T     #OUT
    然后在OB1里面调用:
    CALL  FC     3
    IN1:=MD100
    IN2:=MD104
    IN3:=1.000000e+004
    OUT:=MD108
    这样得出的结果就是想要的结果。
    说白了,就是通过长整数来计算,转过来,再转过去