999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于C++ Builder 6.0的IEEE 754中單精度浮點(diǎn)數(shù)轉(zhuǎn)換實(shí)現(xiàn)

2014-10-14 17:37:10翟振輝
現(xiàn)代電子技術(shù) 2014年20期

翟振輝

摘 要: IEEE 754標(biāo)準(zhǔn)規(guī)定了可以精確表示某一浮點(diǎn)型數(shù)據(jù)的單精度(常用)和雙精度表示方法,這在許多對(duì)數(shù)據(jù)精度要求較高的場(chǎng)合得到廣泛應(yīng)用,而在數(shù)據(jù)通信過(guò)程中所有數(shù)據(jù)都是以十六進(jìn)制打包和解析、二進(jìn)制形式傳輸?shù)模匝芯咳绾胃鶕?jù)該標(biāo)準(zhǔn)把所要傳輸?shù)母↑c(diǎn)型數(shù)據(jù)編程轉(zhuǎn)換成8位十六進(jìn)制數(shù)據(jù)具有重要的實(shí)用意義。這里在分析和研究IEEE 754標(biāo)準(zhǔn)中浮點(diǎn)型數(shù)據(jù)單精度表示方式的基礎(chǔ)上,結(jié)合Borland C++Builder 6.0可視化編程工具,闡述了如何把單精度浮點(diǎn)型數(shù)據(jù)轉(zhuǎn)換成所需要的8位十六進(jìn)制數(shù),以及如何把8位十六進(jìn)制數(shù)轉(zhuǎn)換成單精度浮點(diǎn)類型數(shù)據(jù),并實(shí)現(xiàn)顯示。

關(guān)鍵詞: IEEE 754標(biāo)準(zhǔn); 十六進(jìn)制數(shù); 單精度浮點(diǎn)數(shù); 可視化編程工具

中圖分類號(hào): TN911?34 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2014)20?0027?04

Convert of floating?point data in IEEE754 based on C++ Builder6.0

ZHAI Zhen?hui1, OU Shi?feng1, LIU Ji?zhang1, ZHONG Quan?xiong2, GAO Ying1

(1. Institute of Optoelectronic Information, Yantai University, Yantai 264005, China; 2. Engineering Training Center, Yantai University, Yantai 264005, China)

Abstract: The single precision and double precision expressive methods which can accurately express a float?point data are stipulated in IEEE754 standard. They are widely in the field, in which the accuracy requirement is high. On the base of studying and analyzing the expression of the 32 bits floating?point, how to translate the floating?point data to the needed hexadecimal data, and how to translate the hexadecimal data to the floating?point data are elaborated in combination with the visual programming tools Borland C++ Builder 6.0, and the expression of the 32 bits floating?point data in the IEEE 754 standard. The data display was realized.

0 引 言

IEEE 754是最廣泛使用的浮點(diǎn)數(shù)運(yùn)算標(biāo)準(zhǔn),為許多CPU與浮點(diǎn)運(yùn)算器所采用[1]。這個(gè)標(biāo)準(zhǔn)定義了表示浮點(diǎn)數(shù)的格式(包括負(fù)零-0)與反常值(denormal number)、一些特殊數(shù)值(無(wú)窮與非數(shù)值(NaN))以及這些數(shù)值的“浮點(diǎn)數(shù)運(yùn)算子”。它規(guī)定了4種表示浮點(diǎn)數(shù)值的方式:?jiǎn)尉_度(32位元)、雙精確度(64位元)、延伸單精確度(43位元以上,很少使用)與延伸雙精確度(79位元以上,通常以80位元實(shí)做)。其中只有32位元模式有強(qiáng)制要求,其他都是選擇性的[2]。

Borland C++ Builder是最知名的可視化C++應(yīng)用程序開發(fā)工具之一,它易學(xué)易用的操作界面和功能強(qiáng)大的應(yīng)用組件,可以讓程序員快速建立各種應(yīng)用程序[3]。Borland C++ Builder不僅繼承了Delphi使用簡(jiǎn)便、功能強(qiáng)大、效率高等特點(diǎn),而且它還結(jié)合C++語(yǔ)言所有的優(yōu)點(diǎn)。C++ Builder可以說(shuō)是至今最容易上手的Windows開發(fā)工具[4]。

目前可視化編程中應(yīng)用IEEE處理整型數(shù)據(jù)到浮點(diǎn)型數(shù)據(jù)運(yùn)算的研究還很少,本文側(cè)重于實(shí)現(xiàn)將8位十六進(jìn)制的數(shù)據(jù)轉(zhuǎn)換成浮點(diǎn)型數(shù)據(jù),應(yīng)用于解析Modbus中RTU格式[5]通信所獲得的浮點(diǎn)型數(shù)據(jù),并編寫了上位機(jī)可視化軟件來(lái)顯示。

1 轉(zhuǎn)換算法介紹

1.1 浮點(diǎn)數(shù)保存格式

浮點(diǎn)型數(shù)據(jù)保存的格式[1]如表1所示。其中:S表示符號(hào)位;“1”表示負(fù)數(shù);“0”表示正數(shù);E代表偏移127的冪數(shù),二進(jìn)制階碼 =(EEEE EEEE)-127;M代表24位的尾數(shù),存放在23個(gè)位中,只存儲(chǔ)23位,最高位固定為1,此方法用最少的位數(shù)實(shí)現(xiàn)了較高的有效位數(shù),提高了精度“0”是一個(gè)特定值,冪數(shù)是0,尾數(shù)也是0。

表1 浮點(diǎn)型數(shù)據(jù)保存的格式

1.2 十六進(jìn)制數(shù)轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù)

IEEE 754標(biāo)準(zhǔn)中的浮點(diǎn)保存值不是一個(gè)直接的格式,要把十六進(jìn)制轉(zhuǎn)換為一個(gè)浮點(diǎn)數(shù),必須按照表1中所示的方式進(jìn)行分開。這里又分為三種情況:

(1) E部分不全為0也不全為1的情況;

(2) E部分全部為0的情況;

(3) E部分全部為1的情況。

1.2.1 E部分不全為0也不全為1

以0xC1420000為例,先把0xC1420000寫成表1中所示形式,如下:

SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

1100 0001 0100 0010 0000 0000 0000 0000

由上可以看出,此數(shù)是一個(gè)負(fù)數(shù),二進(jìn)制階碼=(1000 0010)-127 = 3,也就是實(shí)際的冪數(shù)。尾數(shù)是后面的二進(jìn)制數(shù)100 0010 0000 0000 0000 0000,這是已存儲(chǔ)的23位二進(jìn)制,還有一位沒(méi)有被存儲(chǔ)的最高位,固定為1,所以整個(gè)尾數(shù)即:1100 0010 0000 0000 0000 0000則根據(jù)實(shí)際的冪數(shù),浮點(diǎn)型數(shù)為:

[2k×i=023M×2i-23=-12.25] (1)

1.2.2 E部分全為0

這是一種非規(guī)格化的數(shù)據(jù),此時(shí)k=1-(27-1)=-126,完整的位數(shù)部分為0MMM MMMM MMMM MMMM MMMM MMMM。以0x800BCAEF為例,先把0x800BCAEF寫成表1中所示形式,如下:

SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

1000 0000 0000 1011 1100 1010 1110 1111

由上可以看出,此數(shù)是一個(gè)負(fù)數(shù),二進(jìn)制階碼k=1-127 =-126,也就是實(shí)際的冪數(shù)。

尾數(shù)是后面的二進(jìn)制數(shù)000 1011 1100 1010 1110 1111,這是已存儲(chǔ)的23位二進(jìn)制,還有一位沒(méi)有被存儲(chǔ)的最高位,固定為1,所以整個(gè)尾數(shù)即:1000 1011 1100 1010 1110 1111,則根據(jù)實(shí)際的冪數(shù),浮點(diǎn)型數(shù)為:[2k×i=023M×2i-23=-1.082 989 314 25e-39] (2)

1.2.3 E部分全部為1

如果E部分全為1,則系數(shù)k=28-1=127,此時(shí)又分兩大類情況:

(1) 尾數(shù)是0的情況,這類情況下的數(shù)要么是正無(wú)窮大要么是負(fù)無(wú)窮大;

(2) 尾數(shù)不全為0的情況,根據(jù)IEEE 754標(biāo)準(zhǔn),這類情況是表示的一個(gè)沒(méi)有被定義的數(shù),也就是不存在這樣的數(shù)。

結(jié)合以上三部分的分析可得出計(jì)算步驟如下:

(1) 先判斷十六進(jìn)制數(shù)的最高位是否為1:若為1則是負(fù)數(shù),若為0則是正數(shù);

(2) 把該數(shù)右移23位并和0xFF相與,得到二進(jìn)制數(shù)(EEEE EEEE);

(3) 把步驟(2)得到的二進(jìn)制數(shù)(EEEE EEEE)減127得到二進(jìn)制的最高位冪數(shù)(設(shè)為k);

(4) 把原數(shù)和0x7FFFFF相與得到不帶最高位的尾數(shù)(MMM MMMM MMMM MMMM MMMM MMMM),然后再把得到的尾數(shù)的最高數(shù)置“1”,即得到完整的尾數(shù):(1MMM MMMM MMMM MMMM MMMM MMMM);

(5) 在步驟(4)中得到的尾數(shù)的24位二進(jìn)制數(shù)乘以2k并相加即是所求浮點(diǎn)數(shù)

2 編程實(shí)現(xiàn)

打開Borland C++ Builder 6.0,在空白的Form1上放置5個(gè)Edit控件,2個(gè)Label控件,1個(gè)按鈕,布局Form上的控件并修改屬性[3],如圖1所示。

圖1 軟件設(shè)計(jì)界面

軟件工作流程如圖2所示。

3 仿真結(jié)果

把前面舉例的數(shù)據(jù)0xC1420000進(jìn)行計(jì)算,計(jì)算結(jié)果如圖3所示。可由圖3看出計(jì)算結(jié)果和第1.2.1中計(jì)算結(jié)果一致。

其次再把第1.2.2部分中所舉的數(shù)據(jù)用軟件進(jìn)行計(jì)算,結(jié)果如圖3所示。

可由圖4看出,計(jì)算結(jié)果與第1.2.2部分中分析得出的結(jié)果一致。最后把第1.2.3部分中描述的情況用軟件實(shí)現(xiàn),結(jié)果如圖5所示。

圖5顯示的是E部分全部為1且尾數(shù)部分不全為0的情況的計(jì)算結(jié)果。

圖3 E部分不全為0也不全為1數(shù)據(jù)計(jì)算結(jié)果

圖4 E部分全為0數(shù)據(jù)計(jì)算結(jié)果

圖5 E部分全為1且尾數(shù)部分不全為0的數(shù)據(jù)計(jì)算

圖6上半部分顯示的是E部分全部為“1”且尾數(shù)部分全為“0”的一種計(jì)算。由于最高位為“1”,所以計(jì)算結(jié)果是負(fù)無(wú)窮大;下半部分是另外一種計(jì)算,由于最高位是“0”,所以計(jì)算結(jié)果是正無(wú)窮大。

圖6 E部分全為1且尾數(shù)部分全為0的計(jì)算

另外本文又仿真了一組Modbus協(xié)議中表示溫度的十六進(jìn)制數(shù)據(jù),轉(zhuǎn)換成浮點(diǎn)型數(shù)據(jù),仿真結(jié)果如圖7所示。

圖7 溫度數(shù)據(jù)仿真結(jié)果

4 仿真結(jié)果驗(yàn)證

為了驗(yàn)證仿真結(jié)果的正確性,本文編寫了從浮點(diǎn)型數(shù)據(jù)轉(zhuǎn)換成十六進(jìn)制數(shù)據(jù)的計(jì)算軟件,將之前的數(shù)據(jù)進(jìn)行一一驗(yàn)證,驗(yàn)證結(jié)果如圖8、圖9所示。

圖8 數(shù)據(jù)仿真結(jié)果驗(yàn)證

圖9 溫度數(shù)據(jù)仿真結(jié)果驗(yàn)證

為確保本文中計(jì)算軟件的無(wú)誤計(jì)算,本文在-1 000~1 000之間隨機(jī)取數(shù)進(jìn)行了大量的數(shù)據(jù)轉(zhuǎn)換計(jì)算實(shí)驗(yàn),并隨機(jī)記錄了10組數(shù)據(jù),如表2所示。

由表2中數(shù)據(jù)仿真結(jié)果及其驗(yàn)證可以看出本文中所編寫的轉(zhuǎn)換算法的精度是非常高的,能夠滿足高精度測(cè)量?jī)x器的數(shù)據(jù)轉(zhuǎn)換使用,而且可以看出小數(shù)點(diǎn)后保留的位數(shù)越多得出的結(jié)果越接近原始的數(shù)據(jù)。

5 結(jié) 論

利用Borland C++Builder 6.0編程開發(fā)環(huán)境完成的十六進(jìn)制整型數(shù)據(jù)轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù)的軟件實(shí)現(xiàn)了從整型數(shù)據(jù)到浮點(diǎn)型數(shù)據(jù)的轉(zhuǎn)換計(jì)算,經(jīng)過(guò)二次開發(fā)該軟件可被用于Modbus通信協(xié)議中高精度浮點(diǎn)型數(shù)據(jù)的傳輸打包、解析和顯示。另外,本文也完成了從浮點(diǎn)型數(shù)據(jù)到十六進(jìn)制整型數(shù)據(jù)的轉(zhuǎn)換編程及仿真顯示。

參考文獻(xiàn)

[1] Microprocessor Standards Committee of the IEEE Computer Society. IEEE Std754?1985 IEEE standard for floating?point arithmetic [S]. USA: Microprocessor Standards Committee of the IEEE Computer Society, 1985.

[2] 程展鵬.Borland C++ Builder 6 應(yīng)用開發(fā)技術(shù)解析[M].北京:清華大學(xué)出版社,2003.

[3] 譚浩強(qiáng).C語(yǔ)言程序設(shè)計(jì)[M].4版.北京:清華大學(xué)出版社,2010.

[4] 吳逸賢,吳目成.精彩C++ Builder 6程序設(shè)計(jì)[M].北京:科學(xué)出版社,2003.

[5] 全國(guó)工業(yè)過(guò)程測(cè)量和控制標(biāo)準(zhǔn)化技術(shù)委員會(huì).GB/T19582?2008 Modbus通信協(xié)議[S].北京:中國(guó)標(biāo)準(zhǔn)出版社,2008.

[6] 陳鵬,蔡雪梅.NIOS浮點(diǎn)運(yùn)算定制指令的實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2011,34(10):166?168.

[7] 唐小明,張濤,王貞杰,等.一種新的基于FPGA的數(shù)據(jù)格式轉(zhuǎn)換方法[J].現(xiàn)代電子技術(shù),2011,34(16):110?112.

[8] 謝躍雷,陳敏.粒子濾波算法中浮點(diǎn)指數(shù)函數(shù)的FPGA設(shè)計(jì)實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2008,31(18):119?121.

Keywords: IEEE 754 standard; hexadecimal number; floating?point data with single precision; visual programming tool

由上可以看出,此數(shù)是一個(gè)負(fù)數(shù),二進(jìn)制階碼=(1000 0010)-127 = 3,也就是實(shí)際的冪數(shù)。尾數(shù)是后面的二進(jìn)制數(shù)100 0010 0000 0000 0000 0000,這是已存儲(chǔ)的23位二進(jìn)制,還有一位沒(méi)有被存儲(chǔ)的最高位,固定為1,所以整個(gè)尾數(shù)即:1100 0010 0000 0000 0000 0000則根據(jù)實(shí)際的冪數(shù),浮點(diǎn)型數(shù)為:

[2k×i=023M×2i-23=-12.25] (1)

1.2.2 E部分全為0

這是一種非規(guī)格化的數(shù)據(jù),此時(shí)k=1-(27-1)=-126,完整的位數(shù)部分為0MMM MMMM MMMM MMMM MMMM MMMM。以0x800BCAEF為例,先把0x800BCAEF寫成表1中所示形式,如下:

SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

1000 0000 0000 1011 1100 1010 1110 1111

由上可以看出,此數(shù)是一個(gè)負(fù)數(shù),二進(jìn)制階碼k=1-127 =-126,也就是實(shí)際的冪數(shù)。

尾數(shù)是后面的二進(jìn)制數(shù)000 1011 1100 1010 1110 1111,這是已存儲(chǔ)的23位二進(jìn)制,還有一位沒(méi)有被存儲(chǔ)的最高位,固定為1,所以整個(gè)尾數(shù)即:1000 1011 1100 1010 1110 1111,則根據(jù)實(shí)際的冪數(shù),浮點(diǎn)型數(shù)為:[2k×i=023M×2i-23=-1.082 989 314 25e-39] (2)

1.2.3 E部分全部為1

如果E部分全為1,則系數(shù)k=28-1=127,此時(shí)又分兩大類情況:

(1) 尾數(shù)是0的情況,這類情況下的數(shù)要么是正無(wú)窮大要么是負(fù)無(wú)窮大;

(2) 尾數(shù)不全為0的情況,根據(jù)IEEE 754標(biāo)準(zhǔn),這類情況是表示的一個(gè)沒(méi)有被定義的數(shù),也就是不存在這樣的數(shù)。

結(jié)合以上三部分的分析可得出計(jì)算步驟如下:

(1) 先判斷十六進(jìn)制數(shù)的最高位是否為1:若為1則是負(fù)數(shù),若為0則是正數(shù);

(2) 把該數(shù)右移23位并和0xFF相與,得到二進(jìn)制數(shù)(EEEE EEEE);

(3) 把步驟(2)得到的二進(jìn)制數(shù)(EEEE EEEE)減127得到二進(jìn)制的最高位冪數(shù)(設(shè)為k);

(4) 把原數(shù)和0x7FFFFF相與得到不帶最高位的尾數(shù)(MMM MMMM MMMM MMMM MMMM MMMM),然后再把得到的尾數(shù)的最高數(shù)置“1”,即得到完整的尾數(shù):(1MMM MMMM MMMM MMMM MMMM MMMM);

(5) 在步驟(4)中得到的尾數(shù)的24位二進(jìn)制數(shù)乘以2k并相加即是所求浮點(diǎn)數(shù)

2 編程實(shí)現(xiàn)

打開Borland C++ Builder 6.0,在空白的Form1上放置5個(gè)Edit控件,2個(gè)Label控件,1個(gè)按鈕,布局Form上的控件并修改屬性[3],如圖1所示。

圖1 軟件設(shè)計(jì)界面

軟件工作流程如圖2所示。

3 仿真結(jié)果

把前面舉例的數(shù)據(jù)0xC1420000進(jìn)行計(jì)算,計(jì)算結(jié)果如圖3所示。可由圖3看出計(jì)算結(jié)果和第1.2.1中計(jì)算結(jié)果一致。

其次再把第1.2.2部分中所舉的數(shù)據(jù)用軟件進(jìn)行計(jì)算,結(jié)果如圖3所示。

可由圖4看出,計(jì)算結(jié)果與第1.2.2部分中分析得出的結(jié)果一致。最后把第1.2.3部分中描述的情況用軟件實(shí)現(xiàn),結(jié)果如圖5所示。

圖5顯示的是E部分全部為1且尾數(shù)部分不全為0的情況的計(jì)算結(jié)果。

圖3 E部分不全為0也不全為1數(shù)據(jù)計(jì)算結(jié)果

圖4 E部分全為0數(shù)據(jù)計(jì)算結(jié)果

圖5 E部分全為1且尾數(shù)部分不全為0的數(shù)據(jù)計(jì)算

圖6上半部分顯示的是E部分全部為“1”且尾數(shù)部分全為“0”的一種計(jì)算。由于最高位為“1”,所以計(jì)算結(jié)果是負(fù)無(wú)窮大;下半部分是另外一種計(jì)算,由于最高位是“0”,所以計(jì)算結(jié)果是正無(wú)窮大。

圖6 E部分全為1且尾數(shù)部分全為0的計(jì)算

另外本文又仿真了一組Modbus協(xié)議中表示溫度的十六進(jìn)制數(shù)據(jù),轉(zhuǎn)換成浮點(diǎn)型數(shù)據(jù),仿真結(jié)果如圖7所示。

圖7 溫度數(shù)據(jù)仿真結(jié)果

4 仿真結(jié)果驗(yàn)證

為了驗(yàn)證仿真結(jié)果的正確性,本文編寫了從浮點(diǎn)型數(shù)據(jù)轉(zhuǎn)換成十六進(jìn)制數(shù)據(jù)的計(jì)算軟件,將之前的數(shù)據(jù)進(jìn)行一一驗(yàn)證,驗(yàn)證結(jié)果如圖8、圖9所示。

圖8 數(shù)據(jù)仿真結(jié)果驗(yàn)證

圖9 溫度數(shù)據(jù)仿真結(jié)果驗(yàn)證

為確保本文中計(jì)算軟件的無(wú)誤計(jì)算,本文在-1 000~1 000之間隨機(jī)取數(shù)進(jìn)行了大量的數(shù)據(jù)轉(zhuǎn)換計(jì)算實(shí)驗(yàn),并隨機(jī)記錄了10組數(shù)據(jù),如表2所示。

由表2中數(shù)據(jù)仿真結(jié)果及其驗(yàn)證可以看出本文中所編寫的轉(zhuǎn)換算法的精度是非常高的,能夠滿足高精度測(cè)量?jī)x器的數(shù)據(jù)轉(zhuǎn)換使用,而且可以看出小數(shù)點(diǎn)后保留的位數(shù)越多得出的結(jié)果越接近原始的數(shù)據(jù)。

5 結(jié) 論

利用Borland C++Builder 6.0編程開發(fā)環(huán)境完成的十六進(jìn)制整型數(shù)據(jù)轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù)的軟件實(shí)現(xiàn)了從整型數(shù)據(jù)到浮點(diǎn)型數(shù)據(jù)的轉(zhuǎn)換計(jì)算,經(jīng)過(guò)二次開發(fā)該軟件可被用于Modbus通信協(xié)議中高精度浮點(diǎn)型數(shù)據(jù)的傳輸打包、解析和顯示。另外,本文也完成了從浮點(diǎn)型數(shù)據(jù)到十六進(jìn)制整型數(shù)據(jù)的轉(zhuǎn)換編程及仿真顯示。

參考文獻(xiàn)

[1] Microprocessor Standards Committee of the IEEE Computer Society. IEEE Std754?1985 IEEE standard for floating?point arithmetic [S]. USA: Microprocessor Standards Committee of the IEEE Computer Society, 1985.

[2] 程展鵬.Borland C++ Builder 6 應(yīng)用開發(fā)技術(shù)解析[M].北京:清華大學(xué)出版社,2003.

[3] 譚浩強(qiáng).C語(yǔ)言程序設(shè)計(jì)[M].4版.北京:清華大學(xué)出版社,2010.

[4] 吳逸賢,吳目成.精彩C++ Builder 6程序設(shè)計(jì)[M].北京:科學(xué)出版社,2003.

[5] 全國(guó)工業(yè)過(guò)程測(cè)量和控制標(biāo)準(zhǔn)化技術(shù)委員會(huì).GB/T19582?2008 Modbus通信協(xié)議[S].北京:中國(guó)標(biāo)準(zhǔn)出版社,2008.

[6] 陳鵬,蔡雪梅.NIOS浮點(diǎn)運(yùn)算定制指令的實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2011,34(10):166?168.

[7] 唐小明,張濤,王貞杰,等.一種新的基于FPGA的數(shù)據(jù)格式轉(zhuǎn)換方法[J].現(xiàn)代電子技術(shù),2011,34(16):110?112.

[8] 謝躍雷,陳敏.粒子濾波算法中浮點(diǎn)指數(shù)函數(shù)的FPGA設(shè)計(jì)實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2008,31(18):119?121.

Keywords: IEEE 754 standard; hexadecimal number; floating?point data with single precision; visual programming tool

由上可以看出,此數(shù)是一個(gè)負(fù)數(shù),二進(jìn)制階碼=(1000 0010)-127 = 3,也就是實(shí)際的冪數(shù)。尾數(shù)是后面的二進(jìn)制數(shù)100 0010 0000 0000 0000 0000,這是已存儲(chǔ)的23位二進(jìn)制,還有一位沒(méi)有被存儲(chǔ)的最高位,固定為1,所以整個(gè)尾數(shù)即:1100 0010 0000 0000 0000 0000則根據(jù)實(shí)際的冪數(shù),浮點(diǎn)型數(shù)為:

[2k×i=023M×2i-23=-12.25] (1)

1.2.2 E部分全為0

這是一種非規(guī)格化的數(shù)據(jù),此時(shí)k=1-(27-1)=-126,完整的位數(shù)部分為0MMM MMMM MMMM MMMM MMMM MMMM。以0x800BCAEF為例,先把0x800BCAEF寫成表1中所示形式,如下:

SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

1000 0000 0000 1011 1100 1010 1110 1111

由上可以看出,此數(shù)是一個(gè)負(fù)數(shù),二進(jìn)制階碼k=1-127 =-126,也就是實(shí)際的冪數(shù)。

尾數(shù)是后面的二進(jìn)制數(shù)000 1011 1100 1010 1110 1111,這是已存儲(chǔ)的23位二進(jìn)制,還有一位沒(méi)有被存儲(chǔ)的最高位,固定為1,所以整個(gè)尾數(shù)即:1000 1011 1100 1010 1110 1111,則根據(jù)實(shí)際的冪數(shù),浮點(diǎn)型數(shù)為:[2k×i=023M×2i-23=-1.082 989 314 25e-39] (2)

1.2.3 E部分全部為1

如果E部分全為1,則系數(shù)k=28-1=127,此時(shí)又分兩大類情況:

(1) 尾數(shù)是0的情況,這類情況下的數(shù)要么是正無(wú)窮大要么是負(fù)無(wú)窮大;

(2) 尾數(shù)不全為0的情況,根據(jù)IEEE 754標(biāo)準(zhǔn),這類情況是表示的一個(gè)沒(méi)有被定義的數(shù),也就是不存在這樣的數(shù)。

結(jié)合以上三部分的分析可得出計(jì)算步驟如下:

(1) 先判斷十六進(jìn)制數(shù)的最高位是否為1:若為1則是負(fù)數(shù),若為0則是正數(shù);

(2) 把該數(shù)右移23位并和0xFF相與,得到二進(jìn)制數(shù)(EEEE EEEE);

(3) 把步驟(2)得到的二進(jìn)制數(shù)(EEEE EEEE)減127得到二進(jìn)制的最高位冪數(shù)(設(shè)為k);

(4) 把原數(shù)和0x7FFFFF相與得到不帶最高位的尾數(shù)(MMM MMMM MMMM MMMM MMMM MMMM),然后再把得到的尾數(shù)的最高數(shù)置“1”,即得到完整的尾數(shù):(1MMM MMMM MMMM MMMM MMMM MMMM);

(5) 在步驟(4)中得到的尾數(shù)的24位二進(jìn)制數(shù)乘以2k并相加即是所求浮點(diǎn)數(shù)

2 編程實(shí)現(xiàn)

打開Borland C++ Builder 6.0,在空白的Form1上放置5個(gè)Edit控件,2個(gè)Label控件,1個(gè)按鈕,布局Form上的控件并修改屬性[3],如圖1所示。

圖1 軟件設(shè)計(jì)界面

軟件工作流程如圖2所示。

3 仿真結(jié)果

把前面舉例的數(shù)據(jù)0xC1420000進(jìn)行計(jì)算,計(jì)算結(jié)果如圖3所示。可由圖3看出計(jì)算結(jié)果和第1.2.1中計(jì)算結(jié)果一致。

其次再把第1.2.2部分中所舉的數(shù)據(jù)用軟件進(jìn)行計(jì)算,結(jié)果如圖3所示。

可由圖4看出,計(jì)算結(jié)果與第1.2.2部分中分析得出的結(jié)果一致。最后把第1.2.3部分中描述的情況用軟件實(shí)現(xiàn),結(jié)果如圖5所示。

圖5顯示的是E部分全部為1且尾數(shù)部分不全為0的情況的計(jì)算結(jié)果。

圖3 E部分不全為0也不全為1數(shù)據(jù)計(jì)算結(jié)果

圖4 E部分全為0數(shù)據(jù)計(jì)算結(jié)果

圖5 E部分全為1且尾數(shù)部分不全為0的數(shù)據(jù)計(jì)算

圖6上半部分顯示的是E部分全部為“1”且尾數(shù)部分全為“0”的一種計(jì)算。由于最高位為“1”,所以計(jì)算結(jié)果是負(fù)無(wú)窮大;下半部分是另外一種計(jì)算,由于最高位是“0”,所以計(jì)算結(jié)果是正無(wú)窮大。

圖6 E部分全為1且尾數(shù)部分全為0的計(jì)算

另外本文又仿真了一組Modbus協(xié)議中表示溫度的十六進(jìn)制數(shù)據(jù),轉(zhuǎn)換成浮點(diǎn)型數(shù)據(jù),仿真結(jié)果如圖7所示。

圖7 溫度數(shù)據(jù)仿真結(jié)果

4 仿真結(jié)果驗(yàn)證

為了驗(yàn)證仿真結(jié)果的正確性,本文編寫了從浮點(diǎn)型數(shù)據(jù)轉(zhuǎn)換成十六進(jìn)制數(shù)據(jù)的計(jì)算軟件,將之前的數(shù)據(jù)進(jìn)行一一驗(yàn)證,驗(yàn)證結(jié)果如圖8、圖9所示。

圖8 數(shù)據(jù)仿真結(jié)果驗(yàn)證

圖9 溫度數(shù)據(jù)仿真結(jié)果驗(yàn)證

為確保本文中計(jì)算軟件的無(wú)誤計(jì)算,本文在-1 000~1 000之間隨機(jī)取數(shù)進(jìn)行了大量的數(shù)據(jù)轉(zhuǎn)換計(jì)算實(shí)驗(yàn),并隨機(jī)記錄了10組數(shù)據(jù),如表2所示。

由表2中數(shù)據(jù)仿真結(jié)果及其驗(yàn)證可以看出本文中所編寫的轉(zhuǎn)換算法的精度是非常高的,能夠滿足高精度測(cè)量?jī)x器的數(shù)據(jù)轉(zhuǎn)換使用,而且可以看出小數(shù)點(diǎn)后保留的位數(shù)越多得出的結(jié)果越接近原始的數(shù)據(jù)。

5 結(jié) 論

利用Borland C++Builder 6.0編程開發(fā)環(huán)境完成的十六進(jìn)制整型數(shù)據(jù)轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù)的軟件實(shí)現(xiàn)了從整型數(shù)據(jù)到浮點(diǎn)型數(shù)據(jù)的轉(zhuǎn)換計(jì)算,經(jīng)過(guò)二次開發(fā)該軟件可被用于Modbus通信協(xié)議中高精度浮點(diǎn)型數(shù)據(jù)的傳輸打包、解析和顯示。另外,本文也完成了從浮點(diǎn)型數(shù)據(jù)到十六進(jìn)制整型數(shù)據(jù)的轉(zhuǎn)換編程及仿真顯示。

參考文獻(xiàn)

[1] Microprocessor Standards Committee of the IEEE Computer Society. IEEE Std754?1985 IEEE standard for floating?point arithmetic [S]. USA: Microprocessor Standards Committee of the IEEE Computer Society, 1985.

[2] 程展鵬.Borland C++ Builder 6 應(yīng)用開發(fā)技術(shù)解析[M].北京:清華大學(xué)出版社,2003.

[3] 譚浩強(qiáng).C語(yǔ)言程序設(shè)計(jì)[M].4版.北京:清華大學(xué)出版社,2010.

[4] 吳逸賢,吳目成.精彩C++ Builder 6程序設(shè)計(jì)[M].北京:科學(xué)出版社,2003.

[5] 全國(guó)工業(yè)過(guò)程測(cè)量和控制標(biāo)準(zhǔn)化技術(shù)委員會(huì).GB/T19582?2008 Modbus通信協(xié)議[S].北京:中國(guó)標(biāo)準(zhǔn)出版社,2008.

[6] 陳鵬,蔡雪梅.NIOS浮點(diǎn)運(yùn)算定制指令的實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2011,34(10):166?168.

[7] 唐小明,張濤,王貞杰,等.一種新的基于FPGA的數(shù)據(jù)格式轉(zhuǎn)換方法[J].現(xiàn)代電子技術(shù),2011,34(16):110?112.

[8] 謝躍雷,陳敏.粒子濾波算法中浮點(diǎn)指數(shù)函數(shù)的FPGA設(shè)計(jì)實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2008,31(18):119?121.

Keywords: IEEE 754 standard; hexadecimal number; floating?point data with single precision; visual programming tool

主站蜘蛛池模板: 国产又爽又黄无遮挡免费观看 | 99国产在线视频| 一区二区影院| 国产精品人人做人人爽人人添| 手机成人午夜在线视频| 中文纯内无码H| 91亚洲影院| 女同久久精品国产99国| www.国产福利| 久久a级片| 亚洲av无码片一区二区三区| 亚洲男人的天堂在线| 欧美成人综合视频| 国产精品欧美亚洲韩国日本不卡| 亚洲中文字幕在线精品一区| 日韩欧美在线观看| 日韩在线欧美在线| 91久久偷偷做嫩草影院免费看 | 日韩少妇激情一区二区| 在线中文字幕日韩| 亚洲天堂自拍| 中文无码日韩精品| 欧美日韩导航| 狠狠色综合网| 69av在线| 国产高潮流白浆视频| 国产乱子伦视频在线播放| 99re在线视频观看| 99视频在线免费| 日韩欧美国产中文| 亚洲国产中文在线二区三区免| 国产情侣一区| 2021国产精品自产拍在线观看| 99热国产这里只有精品无卡顿"| 国产成人无码久久久久毛片| 99一级毛片| 欧美日韩高清在线| 亚洲中久无码永久在线观看软件| 中文无码精品a∨在线观看| 亚洲国产午夜精华无码福利| 制服无码网站| 国产在线专区| 成人在线亚洲| 一本大道无码日韩精品影视| 国产乱子伦手机在线| a色毛片免费视频| 色偷偷综合网| 精品天海翼一区二区| 色老头综合网| 一区二区理伦视频| 午夜激情婷婷| 一本久道久综合久久鬼色| 国产精品久久精品| 免费观看精品视频999| 久久这里只精品国产99热8| 国产精品自拍合集| 国产在线八区| 波多野结衣国产精品| 日本一本正道综合久久dvd| 就去色综合| 国产成人高清精品免费5388| 日韩欧美一区在线观看| 国产成人精品高清在线| 伊人久热这里只有精品视频99| 久久免费精品琪琪| 国产剧情一区二区| 福利在线不卡| 一本无码在线观看| 色婷婷在线播放| 大陆精大陆国产国语精品1024| 激情国产精品一区| 91美女视频在线观看| www.亚洲天堂| 免费国产好深啊好涨好硬视频| 午夜啪啪福利| 精品一区二区三区波多野结衣| 国产精品自拍露脸视频| 青青操国产| 国产免费a级片| 国产欧美日韩另类| WWW丫丫国产成人精品| 国产精品区视频中文字幕|