发表于:2014/5/8 7:44:17
#0楼
网友ktissot在用下面3条指令将浮点数转换为双整数时,发现了一个神秘的现象。
L MD0
RND //浮点数四舍五入
T MD4
我们知道,最大的正的双整数是2147483647,大于这个数,RND指令转换会出错。
但是他的帖子说实际上能转换的最大的浮点数不是2147483647.0,而是2147483583.0。
这一段本应正常转换的区间转换会出错,为什么转换出错的分界点是2147483583.0,这里面隐藏了什么秘密?
这件事引起我极大的兴趣,为此我用仿真做了大量的实验,下面是我做实验发现的更多的现象:
1.转换出错的情况
RND指令的帮助中说:“如果超出允许范围,则状态位OV和OS被置位为1。结果存在累加器1中”。“出现错误(使用了不能表示为32位整数的NaN或浮点数)时不执行转换并显示溢出。”。
下图用程序状态监控状态字STATUS WORD。
大于2147483647.0时转换出错。
大于2147483584.0到2147483647.0这一段照理说在应该在能转换的范围里,但是转换也会出错,状态字的OV和OS位(第4、5位)被置位为1(见下图)。MD4中是没有转换的浮点数,而不是双整数。转换出错的分界点是2147483584.0。
2.转换成功的情况
小于16777215.0左右转换结果完全正确。转换成功时OV和OS为0。
小于2147483584.0到16777215.0这一段可以转换,但是转换有误差。
接近2147483584.0时,最大误差为64。
大于2147483456.0 ~ 2147483584.0时(区间范围为128.0),转换后得到的双整数均为2147483520(16#7FFF FF80,见下图)。转换结果2147483520是区间中点的值,(2147483456 + 2147483584)/2= 2147483520。
大于2147483328.0 ~ 2147483456.0时,转换后得到的双整数均为2147483392(16#7FFF FF00)。
大于2147483200.0 ~ 2147483328.0时,转换后得到的双整数均为2147483264(16#7FFF FE80)。
经过分析,我已经找到了上述现象的原因,结果暂不公布,希望有兴趣的网友一起来分析一下,共享解决问题的快乐。
我是廖常初,是一个高校的老师,曾在企业从事机械、电气技术工作,长期从事工业控制和PLC应用的教学、科研和工程应用工作。博客中的日志除注明外均为原创。愿意在此与大家探讨工控的问题!
廖常初工控博客地址:http://blog.gkong.com/blog.asp?name=liaochangchu
我曾写过几本小书: 《PLC编程及应用》第3版(S7-200)、《S7-300/400 PLC应用技术》第3版、《FX系列PLC编程及应用》第2版、《S7-200 PLC编程及应用》、《PLC基础及应用》第2版(FX系列大专教材)、《西门子人机界面(触摸屏)组态与应用技术》、《西门子工业通信网络组态编程与故障诊断》、《S7-1200 PLC编程及应用》第2版、《跟我动手学S7-300/400 PLC》、《跟我动手学FX系列PLC》
机械工业出版社廖常初图书专题:http://www.gkong.com/zt/liaochangchu/
廖常初工控博客地址:http://blog.gkong.com/blog.asp?name=liaochangchu
我曾写过几本小书: 《PLC编程及应用》第3版(S7-200)、《S7-300/400 PLC应用技术》第3版、《FX系列PLC编程及应用》第2版、《S7-200 PLC编程及应用》、《PLC基础及应用》第2版(FX系列大专教材)、《西门子人机界面(触摸屏)组态与应用技术》、《西门子工业通信网络组态编程与故障诊断》、《S7-1200 PLC编程及应用》第2版、《跟我动手学S7-300/400 PLC》、《跟我动手学FX系列PLC》
机械工业出版社廖常初图书专题:http://www.gkong.com/zt/liaochangchu/