RND指令执行出错的原因分析

时间:2023-03-17作者:佚名

网友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。

RND指令执行出错的原因分析

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)。

经过分析,我已经找到了上述现象的原因,结果暂不公布,希望有兴趣的网友一起来分析一下,共享解决问题的快乐。

RND指令执行出错的原因分析

3.转换结果分析

大于2147483456.0 ~ 2147483584.0时转换后得到2147483520(16#7FFF FF80)。

大于2147483328.0 ~ 2147483456.0时转换后得到2147483392(16#7FFF FF00)。

大于2147483200.0 ~ 2147483328.0时转换后得到2147483264(16#7FFF FE80)。

上述3个区间内部的间隔为128.0,转换结果为区间的中点(2147483456 2147483584)/2= 2147483520。

所以这种转换并不精确,最大误差为128/2=64。

浮点数转换为双整数的转换误差的根本原因是32位浮点数和32位双整数的有效位数的差异造成的。

浮点数由一位符号位、8位指数和尾数的小数部分(23位)组成。尾数的位数决定了浮点数的精度。尾数的整数部分为1,小数部分为23位,所以尾数的有效数字为24位。

双整数除去一位符号位,其有效位数为31位,因此浮点数的有效位数比双整数少7位。

2147483456.0 ~ 2147483584.0相差128.0,它们对应的整数为31位有效数字,这些浮点数输入plc后,因为浮点数的有效位数只有24位,它们的尾数相同,对应的十六进制表示的浮点数均为16#4EFF FFFF,或2.17484e 009(注意有效尾数为十进制7位,而不是对应的整数的10位)。所以转换为双整数后均为2147483520。

ktissot网友说:“这就像看一片湖水一样,你可以看到水和浪花,但是绝对看不到水分子。”由于有效位数较小,浮点数不能分辨“水分子”2147483457.0 ~ 2147483584.0,我们只能看到“浪花”2147483520(16#7FFF FF80)。

如果浮点数较小,例如小于16777215(16#FF FFFF),整数部分只有24位,转换后就没有上述的误差了。在此基础上增大,整数部分的位数越大,误差越大。

因为有效位数相差7位,在接近双整数最大值的区段,浮点数的尾数相差一个数时,转换为双整数后,相差128。2的7次方等于128。

4.高端转换出错的原因分析

为什么最高端大于2147483584.0的数不能正确地转换呢?请注意小于2147483648.0到大于2147483584.0这段范围刚好是64.0(128.0的一半)。RND指令在转换时将这段范围的尾数四舍五入后,尾数的最低位加1,相当于转换后的整数加128(16#80),由上述的16#7FFF FF80(2147483520)加16#80后变为16#8000 0000,超出了双整数整数的允许范围,产生了溢出,所以转换出错。

相关阅读

插座为啥左零右火,可不可以反接,会有什么后果?80%电工答不出

家庭装修为什么插座左零右火,插座遵循左插孔接零线,右插孔接火线,为什么要这样接呢?一个小常识很多电工也许真的答不上来,都回答是国家标准吧?行业都这么做?到底这样接有...
2023-06-11
插座为啥左零右火,可不可以反接,会有什么后果?80%电工答不出

装修水电工干的活,你看看值不值(偷偷告诉你,他250元一天)

邻居家请来的250块钱一天的水电工师傅做的水电工艺,上图给大家看看,朋友们觉得值吗? 通道走的线管,错落有致,整齐划一 线管、水管走天顶,后期维修较方便,成本也低。 啧啧...
2023-06-11
装修水电工干的活,你看看值不值(偷偷告诉你,他250元一天)

装修电工布线注意事项

1.在您住宅的进线处,一定要加装带有过流保护、漏电保护的三保护开关的配电箱 。因为有了漏电开关,一旦家中发生漏电现象,如电器外壳带电,人身触电等,漏电开关会跳闸,从...
2023-03-21

详解运放恒流源电路的工作原理

在LCD等液晶显示系统中,其发光的原理是通过背光来照亮其像素点,根据不同的环境亮度,通过调节背光来达到不同的显示亮度。这一期,我和大家分享一下 背光驱动电路的几种方案...
2023-06-27
详解运放恒流源电路的工作原理

裸母线、封闭母线。插接式母线安装

绝缘子的底座、套管的法兰,保护网( 罩)及母线支架等可接近裸露导体应接地(PE)或接零(PEN)可靠。不应作为接地(PE)或接零(PEN)的接续导体。 母线与母线或母线与电器 界限 端子,采用螺...
2023-04-30

热销商品

消防配件二氧化碳灭火器2 3 5 7KG弯头喷管24Kg干冰CO2外喷头喷嘴

二氧化碳灭火器配件中的2357KG弯头喷管与24Kg干冰CO₂外喷头喷嘴,是专业消防设备的重要组成部分。该弯头喷管采用高强度耐腐蚀材料制造,连接灵活,适用于高压CO₂灭火...
4.5

雷士照明led筒灯孔灯客厅吊顶天花灯嵌入式过道筒灯射灯桶灯家用

雷士照明LED筒灯是一款专为现代家居设计的嵌入式照明产品,适用于客厅、吊顶、过道、卧室等空间。采用高品质LED光源,光线柔和均匀,显色指数高,有效还原真实色彩,营造舒...
5.78

雷士照明嵌入式防眩筒灯射灯窄边过道灯深杯客厅无主灯天花灯米雪

雷士照明嵌入式防眩筒灯射灯——“米雪”系列,专为现代无主灯设计打造。采用窄边深杯结构,有效控制杂散光,实现精准防眩,营造舒适柔和的光环境。适用于客厅、过道、天...
25.67

M36到M3喷塑喷涂喷粉喷漆 螺纹耐高温硅胶保护套堵孔塞螺纹孔堵头

M36到M3喷塑、喷涂、喷粉及喷漆螺纹耐高温硅胶保护套堵孔塞,专为工业喷涂作业设计。采用优质耐高温硅胶材质,可承受高达260℃的高温,有效保护螺纹孔在表面处理过程中...
7.2

德力西官方插座旗舰店奶油风空调16A菱花白开关墙壁插座五孔面板

德力西官方插座旗舰店推出了一款奶油风空调16A菱花白开关墙壁插座五孔面板,这款产品以其独特的设计风格和卓越的品质赢得了消费者的喜爱。 首先,这款插座的外观设...
5.37

网站栏目