恭喜,你发布的帖子
发布于 2019-12-14 09:56:52
15楼
不是BUG,的确是我的编程不够严谨。
考虑到浮点数的精度问题,即使后来我改成LREAL类型,也只是把问题掩盖了!
改成DINT_TO_INT(TRUNC(LN(UINT_TO_LREAL(SWAP(#iTemp)))/LN(LReal#2.0) +1.0E-9 )); 可能更能满足实际的应用需要。 这个可以涵盖32位双字的应用。
其实我的应用是求一个字或者双字内 某一个位为1的最高位数。 比如某个数为63,它的二进制为11 1111,通过该指令返回值为 5 (按照ZANE的想法使用ROUND则得到6, 我需要的是截尾取整,而不是简单地四舍五入)。
当然,最靠谱的办法就是用移位判断,但是程序啰嗦,16位字需要移16次,32位字需要移32次, 或者用二分位法。 但是都没有我这个指令来得简洁, 只是简洁过头了没有考虑到精度问题。
其实浮点运算是最慢的,布尔运算是很快的。而使用M区变量布尔运算是最快的。
看似程序啰嗦,其实处理起来是速度并不慢。这是PLC中布尔运算器的强项。
这种通用函数功能,真应该写成个FC。
请填写推广理由:
分享
只看
楼主