最近在用Fx3U结构化工作做一个项目,发现用浮点数运算的时候会出现计算误差,如下图:
45.0/0.002结果应该是22450.0,但是结果是22499,为了排除是运算过程中的问题,我加了一个运算中转,如下图:
这里能看出转换函数输入值是22500.0(也就是t_float的值),但是浮点转整数后却变成了22499???于是我觉得可能是精度问题,想验证一下,就把脉冲当量参数缩小10倍,变成0.0002,但是奇迹出现了,转换结果又与输入值是一样的,如下图(一个是运算中转的,一个是直接运算转换的):
我用了DINT函数和REAL_TO_DINT_E函数都试过,结果是一样的。实在是令人费解,希望高人指点迷津!
楼主最近还看过
我个人认为这是三菱对于指令的底层处理问题,原因在于其对于借位的处理,我认为三菱不会对其进行修正。
当发生借位处理时,其后部小数被直接丢弃了,而不是和其他品牌一样进行了四舍五入。
可以看到,当除数为0.002时,发生了借位,因此小数被丢弃,所以实际转换结果成为了22499,这是INT转换指令的处理问题,和浮点数的运算指令无关。
同样,当除数为0.002时,此时运算结果并不产生小数,所以没有出现借位,所以结果正确了。
我认为,用户可以对M8021进行判断,如果M8021为ON时,对转换结果+1处理。但是这个操作存在BUG,更佳的方式是编程将浮点数进行四舍五入后进行转换为整数的操作,因为可能存在小数小于0.5的情况,如下图,这种情况下+1显然会存在较大的误差。
HAVE FUN!