當前位置:機電之家首頁 >> PLC技術>> PLC文案資料 >> 行業(yè)分析 >> rnd指令執(zhí)行出錯的原因分析
rnd指令執(zhí)行出錯的原因分析

網(wǎng)友ktissot在用下面3條指令將浮點數(shù)轉換為雙整數(shù)時,發(fā)現(xiàn)了一個神秘的現(xiàn)象。

l md0

rnd //浮點數(shù)四舍五入

t md4

我們知道,最大的正的雙整數(shù)是2147483647,大于這個數(shù),rnd指令轉換會出錯。

但是他的帖子說實際上能轉換的最大的浮點數(shù)不是2147483647.0,而是2147483583.0。

這一段本應正常轉換的區(qū)間轉換會出錯,為什么轉換出錯的分界點是2147483583.0,這里面隱藏了什么秘密?

這件事引起我極大的興趣,為此我用仿真做了大量的實驗,下面是我做實驗發(fā)現(xiàn)的更多的現(xiàn)象:

1.轉換出錯的情況

rnd指令的幫助中說:“如果超出允許范圍,則狀態(tài)位ov和os被置位為1。結果存在累加器1中”?!俺霈F(xiàn)錯誤(使用了不能表示為32位整數(shù)的nan或浮點數(shù))時不執(zhí)行轉換并顯示溢出?!薄?/p>

下圖用程序狀態(tài)監(jiān)控狀態(tài)字status word。

大于2147483647.0時轉換出錯。

大于2147483584.0到2147483647.0這一段照理說在應該在能轉換的范圍里,但是轉換也會出錯,狀態(tài)字的ov和os位(第4、5位)被置位為1(見下圖)。md4中是沒有轉換的浮點數(shù),而不是雙整數(shù)。轉換出錯的分界點是2147483584.0。

2.轉換成功的情況

小于16777215.0左右轉換結果完全正確。轉換成功時ov和os為0。

小于2147483584.0到16777215.0這一段可以轉換,但是轉換有誤差。

接近2147483584.0時,最大誤差為64。

大于2147483456.0 ~ 2147483584.0時(區(qū)間范圍為128.0),轉換后得到的雙整數(shù)均為2147483520(16#7fff ff80,見下圖)。轉換結果2147483520是區(qū)間中點的值,(2147483456 + 2147483584)/2= 2147483520。

大于2147483328.0 ~ 2147483456.0時,轉換后得到的雙整數(shù)均為2147483392(16#7fff ff00)。

大于2147483200.0 ~ 2147483328.0時,轉換后得到的雙整數(shù)均為2147483264(16#7fff fe80)。

經(jīng)過分析,我已經(jīng)找到了上述現(xiàn)象的原因,結果暫不公布,希望有興趣的網(wǎng)友一起來分析一下,共享解決問題的快樂。

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個區(qū)間內部的間隔為128.0,轉換結果為區(qū)間的中點(2147483456 + 2147483584)/2= 2147483520。

所以這種轉換并不精確,最大誤差為128/2=64。

浮點數(shù)轉換為雙整數(shù)的轉換誤差的根本原因是32位浮點數(shù)和32位雙整數(shù)的有效位數(shù)的差異造成的。

浮點數(shù)由一位符號位、8位指數(shù)和尾數(shù)的小數(shù)部分(23位)組成。尾數(shù)的位數(shù)決定了浮點數(shù)的精度。尾數(shù)的整數(shù)部分為1,小數(shù)部分為23位,所以尾數(shù)的有效數(shù)字為24位。

雙整數(shù)除去一位符號位,其有效位數(shù)為31位,因此浮點數(shù)的有效位數(shù)比雙整數(shù)少7位。

2147483456.0 ~ 2147483584.0相差128.0,它們對應的整數(shù)為31位有效數(shù)字,這些浮點數(shù)輸入后,因為浮點數(shù)的有效位數(shù)只有24位,它們的尾數(shù)相同,對應的十六進制表示的浮點數(shù)均為16#4eff ffff,或2.17484e+009(注意有效尾數(shù)為十進制7位,而不是對應的整數(shù)的10位)。所以轉換為雙整數(shù)后均為2147483520。

ktissot網(wǎng)友說:“這就像看一片湖水一樣,你可以看到水和浪花,但是絕對看不到水分子?!庇捎谟行粩?shù)較小,浮點數(shù)不能分辨“水分子”2147483457.0 ~ 2147483584.0,我們只能看到“浪花”2147483520(16#7fff ff80)。

如果浮點數(shù)較小,例如小于16777215(16#ff ffff),整數(shù)部分只有24位,轉換后就沒有上述的誤差了。在此基礎上增大,整數(shù)部分的位數(shù)越大,誤差越大。

因為有效位數(shù)相差7位,在接近雙整數(shù)最大值的區(qū)段,浮點數(shù)的尾數(shù)相差一個數(shù)時,轉換為雙整數(shù)后,相差128。2的7次方等于128。

4.高端轉換出錯的原因分析

為什么最高端大于2147483584.0的數(shù)不能正確地轉換呢?請注意小于2147483648.0到大于2147483584.0這段范圍剛好是64.0(128.0的一半)。rnd指令在轉換時將這段范圍的尾數(shù)四舍五入后,尾數(shù)的最低位加1,相當于轉換后的整數(shù)加128(16#80),由上述的16#7fff ff80(2147483520)加16#80后變?yōu)?6#8000 0000,超出了雙整數(shù)整數(shù)的允許范圍,產(chǎn)生了溢出,所以轉換出錯。

作者:未知 點擊:2045次 [打印] [關閉] [返回頂部]
本文標簽:rnd指令執(zhí)行出錯的原因分析
* 由于無法獲得聯(lián)系方式等原因,本網(wǎng)使用的文字及圖片的作品報酬未能及時支付,在此深表歉意,請《rnd指令執(zhí)行出錯的原因分析》相關權利人與機電之家網(wǎng)取得聯(lián)系。
電子樣本

SN系列樣冊
:鞏經(jīng)理
:13915946763
:南京塞姆泵業(yè)有限公司
個人求購

唐多 【求購】  DCS系統(tǒng)...  2025-12-11
康經(jīng)理 【求購】  鈦1混合器  2025-12-10
陳圣英 【求購】  金剛石刻刀  2025-12-10
汪先生 【求購】  變壓器套管  2025-12-10
武女士 【求購】  循環(huán)冷卻水...  2025-12-9
朱經(jīng)理 【求購】  華乘局放  2025-12-9
孫工 【求購】  進口線棒  2025-12-9
王經(jīng)理 【求購】  浪涌電機保...  2025-12-9
VIP公司推薦